如果Socket
代表客户端和ServerSocket
代表服务器端,为什么Socket.read
要从服务器端读取数据?我真的很困惑,你能解释一下吗?
9 回答
(我发布这个答案是因为我总是觉得让逻辑正确很重要。)
我建议你看看下面的示例。
http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
诚然,在进行 TCP/IP 通信时,所有必要的信息都可以由Socket
类单独提供,仅用于通信目的。无论是在服务器端还是客户端。
从上面的链接可以看出,服务器端使用下面的代码来获取自己的Socket
实例。也就是说,在同一服务器本地端口和客户端端口对上创建另一个套接字。
然后,服务器使用此Socket
实例与客户端对话。
为了使图片完整,下面的代码片段显示了客户端的Socket
实例。
因此,如果Socket
已经可以做到这一切,为什么我们还需要ServerSocket
?
这是因为通过 TCP/IP 协议进行通信的工作范式。
当 2 个程序通过 TCP/IP 通信时,通常一个会被动监听/等待一个<IP:port>
,另一个会主动连接到它。
所以你可以看到,在这个starting phase
交流过程中,双方的行为非常不同。因此使用了 2 个不同的类来反映这种差异。
Socket
类封装了活动端的行为。(又名客户)ServerSocket
类封装了被动端(又名服务器)的行为
一旦ServerSocket
完成其侦听任务和detected
传入连接,它将accept()
创建一个新Socket
实例以促进通信。
同样,在java.nio
包中,您会找到ServerSocketChannel
和SocketChannel
类。而且,它们的行为是这样的:
ServerSocketChannel -------------> SocketChannel
accept()
所以,在某种程度上,我同意@JohnK 在评论中指出的观点,it's more or less just a 6-letter difference
。
为什么socket.read从服务器端读取数据
因为它正在读取服务器通过网络发送的数据,所以它不是直接读取服务器文件系统或资源(db、ram 或类似的东西),而是读取已经由 ServerSocket 处理的数据。
将 Socket 视为您的 Web 浏览器,将 ServerSocket 视为远程 Web 服务器。
当您请求图像、页面等时,网络服务器( ServerSocket )将字节写入客户端,然后客户端必须读取它们(知道网络服务器发送的内容对吗?)并通过将它们显示到最终结果来处理它们用户。
ServerSocket/Socket 也发生了同样的情况,但级别较低。套接字从 ServerSocket 读取信息。
是否有意义?
首先,让我们澄清一下 IS 的Socket
样子:在常见情况下,Socket
是 IP 和端口 via 的串联:
,例如:127.0.0.1:8080
.
因此,您决定使用Socket
. 没有什么太复杂的。client
以下是关于在and之间建立联系的简短说明server
:
- 首先,让我们澄清一个事实,即我们
client
有自己的Socket
并且知道server
IP 地址和端口。因为server
只提供ServerSocket
和端口。在这两种情况下,端口都是 0 到 65535 之间的相同数字。 因此,我们决定将我们的连接
client
到我们的server
:client
Socket clientSocket
使用我们的已知 IP 和端口创建他的对象server
。server
使用他的方法获得传入的连接请求,ServerSocket.accept()
该方法生成新Socket newClientSocket
对象(仍然在server
一边(!))。进一步的数据交换通过
clientSocket
andnewClientSocket
对象(不在clientSocket
and之间ServerSocket
)进行。
这是了解基本连接过程的近乎完美的图片(请记住,该图片Socket
上的对象Client
- 相同的对象)。
Client.clientSocket
做完这个简单的结构后,需要在Server.newClientSocket
两边打开两个流来读写信息。
java.net.ServerSocket
此类实现服务器套接字。服务器套接字等待通过网络进入的请求。它根据该请求执行一些操作,然后可能将结果返回给请求者。
java.net.Socket
此类实现客户端套接字(也称为“套接字”)。套接字是两台机器之间通信的端点。
ServerSocket 又是一个具有服务器端点附加功能的 Socket。服务器功能包括监听端口和接受传入连接等......
ServerSocket
被创建到bind
一个端口和listen
一个connect
来自客户端。因此,服务器只是等待对话而不启动对话。
ClientSocket
创建到connect
inglisten
服务器。客户端启动连接。
示例:以呼入呼叫中心为例。这些服务是服务器。他们不发起呼叫,而是等待来自客户的呼叫。一旦电话接通,他们就可以进行双向对话。
因为它正在读取服务器发送给您的内容。
Socket
用于客户端,ServerSocket
用于服务器端。