ServerSocket在连接后如何接受套接字?

时间:2019-02-06 21:50:57

标签: java sockets networking serversocket

我意识到您可以在Socket不接受的情况下写到ServerSocket。当我呼叫ServerSocket.accept()时,它会自动获得已连接的Socket,而无需再次connect()

public static void main(String[] args)
{
    ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(0);
    int boundPort = serverSocket.getLocalPort();
    String host = serverSocket.getInetAddress().getCanonicalHostName();

    Socket socket = new Socket(host, boundPort);
    write("Hi!"); // writes to socket's BufferedOutputStream

    Socket acceptedSocket = serverSocket.accept();
    read(); // reads and prints acceptedSocket's BufferedInputStream
}

输出:

Hi!

不仅Socket被接受,即使我在OutputStream之前写到accept(),消息也被输出。我尝试查看源代码,但是很难遵循。所以我的问题是,accept()的处理流程是什么?某处是否有连接的Sockets缓冲区?

此外,如何写入OutputStream?书面数据何时确切通过网络发送?

谢谢!

编辑:收到此问题的答案后,我在Linux上的man 2 accept中找到了另一种解释。

1 个答案:

答案 0 :(得分:0)

这就是实际情况。

  1. 打开/绑定服务器套接字
  2. 创建套接字A,连接到服务器套接字。套接字A半连接,等待服务器上的接受。
  3. 将数据写入套接字A缓冲区;没有任何传输,因为它实际上没有连接。
  4. 接受服务器套接字上的套接字A。
  5. 套接字A中的缓冲数据被传输到服务器。
  6. 在服务器上读取传输的数据。