ServerSocket在连接后如何接受Socket?

问题描述 投票:0回答:1

我已经意识到,如果没有被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的另一个解释。

java sockets networking serversocket
1个回答
0
投票

这就是实际发生的事情。

  1. 打开/绑定服务器套接字
  2. 创建套接字A,连接到服务器套接字。套接字A在服务器上连接一半待接受。
  3. 将数据写入Socket A缓冲区;没有传输,因为它实际上没有连接。
  4. 接受服务器套接字上的套接字A.
  5. 套接字A中的缓冲数据传输到服务器。
  6. 传输的数据在服务器上读出。
© www.soinside.com 2019 - 2024. All rights reserved.