java - Socket和ServerSocket通信不清楚
问题描述
我希望有人能澄清一个我认为我有的误解。我正在阅读 Java 上的套接字编程,但并不真正了解事物的实际流程。以下是我对以下场景的两种可能解释。
Client
- 套接字实例已创建
Socket s = new Socket("server ip", 9999);
Server
- 创建用于接受通信的 ServerSocket
ServerSocket ss = new ServerSocket(9999);
- 等待沟通
Socket sss = ss.accept();
服务器程序接受后,图表会是什么样子?
红色箭头代表最终的通信流
服务器接受客户端后的连接会是这样吗?(客户端与服务器创建的套接字通信,而不是服务器套接字)
或者图表看起来像这样?(客户端通过服务器套接字与服务器保持通信。服务器通过接受连接时创建的套接字进行通信。)
解决方案
套接字是两个主机(客户端和服务器)之间连接的抽象。建立连接后,客户端和服务器主机从套接字获取输入和输出流,并使用这些流相互发送数据。(在此处阅读更多详细信息)。
在客户端:
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。与客户端类似,服务器可以使用OutputStream
和InputStream
从套接字写入和读取数据。
有关详细信息,请参阅此处。
推荐阅读
- c# - 如何使用 Visual Studio 在 XAML 中搜索 UserControl?
- haskell - 使用修改和放置时字符串、列表的 MonadState 问题
- bootloader - TriCore TC1797 二进制图像的 Ghidra 加载程序
- javascript - 在条件函数中使用 return
- apache-beam - 使用 Java 中的 Beam SDK 创建多参数 UDF
- excel - 如何在excel中提取特定文本?
- python - Python Tkinter:在帧之间传递日历选择
- python - python 3.8的Openssl问题
- javascript - 如何在游戏状态为暂停时停止游戏的播放列表,并在游戏完成暂停状态后重新播放?JavaScript
- reactjs - React & Axios - 从对象内部的对象中获取值