首页 > 解决方案 > Socket和ServerSocket通信不清楚

问题描述

我希望有人能澄清一个我认为我有的误解。我正在阅读 Java 上的套接字编程,但并不真正了解事物的实际流程。以下是我对以下场景的两种可能解释。

Client

  1. 套接字实例已创建Socket s = new Socket("server ip", 9999);

Server

  1. 创建用于接受通信的 ServerSocketServerSocket ss = new ServerSocket(9999);
  2. 等待沟通Socket sss = ss.accept();


服务器程序接受后,图表会是什么样子?

红色箭头代表最终的通信流

服务器接受客户端后的连接会是这样吗?(客户端与服务器创建的套接字通信,而不是服务器套接字)

图1

或者图表看起来像这样?(客户端通过服务器套接字与服务器保持通信。服务器通过接受连接时创建的套接字进行通信。)

在此处输入图像描述

标签: javasocketsnetworkingserverclient

解决方案


套接字是两个主机(客户端和服务器)之间连接的抽象。建立连接后,客户端和服务器主机从套接字获取输入和输出流,并使用这些流相互发送数据。(在此处阅读更多详细信息)。

此图可能对您有所帮助。 在此处输入图像描述

在客户端:

  • Socket socket = new Socket("server ip", 9999);

这会通过网络建立连接。

  • InputStream in = socket.getInputStream();

建立连接后,从套接字连接获取输入流以读取数据。

  • OutputStream out = socket.getOutputStream(); 使用来自套接字连接的输出流来写入数据。

在服务器上:

  • ServerSocket ss = new ServerSocket(9999);

启动一个监听 TCP 套接字(服务器套接字),它绑定到已知的本地端口,监听并接受来自客户端的连接。

  • Socket socket = ss.accept();

阻塞当前线程,直到客户端连接,并返回已接受连接的已连接 Socket。注意,这里它返回与客户端相同类型的 java.net.Socket。与客户端类似,服务器可以使用OutputStreamInputStream从套接字写入和读取数据。

有关详细信息,请参阅此处


推荐阅读