![](/img/trans.png)
[英]Java : what is the difference between serversocket and datagramsocket?
[英]What is the difference between Socket and ServerSocket?
如果Socket
代表客户端, ServerSocket
代表服务端,那为什么Socket.read
从服务端读取数据呢? 我真的很困惑,你能帮我澄清一下吗?
(我发布这个答案是因为我总是觉得使逻辑正确很重要。)
我建议您查看以下示例。
http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
诚然,在进行 TCP/IP 通信时,所有必要的信息都可以由Socket
类单独提供,仅用于通信目的。 无论是在服务器端还是客户端。
从上面的链接可以看出,服务器端使用以下代码来获取自己的Socket
实例。 也就是说,在相同的服务器本地端口和客户端端口对上创建另一个套接字。
然后,服务器使用此Socket
实例与客户端对话。
为了使图片完整,下面的代码片段显示了客户端的Socket
实例。
那么如果Socket
已经可以做到这一切,为什么我们还需要ServerSocket
呢?
这是因为通过 TCP/IP 协议进行通信的工作范式。
当两个程序通过 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 服务器。
当您请求图像、页面等时,网络服务器( The ServerSocket )将字节写入客户端,反过来客户端必须读取它们(以了解网络服务器正确发送了什么?)并通过将它们显示到最后来处理它们用户。
ServerSocket/Socket 也发生了同样的情况,但发生在较低级别。 套接字从 ServerSocket读取信息。
有意义吗?
首先,让我们澄清一下 IS Socket
什么样的:在常见情况下, Socket
是 IP 和端口的串联,通过:
,例如: 127.0.0.1:8080
。
因此,您决定使用Socket
制作客户端-服务器应用程序。 没有什么太复杂的。 以下是有关在client
和server
之间建立连接的简短说明:
client
有自己的Socket
并且知道server
IP 地址和端口。 对于server
,只提供了ServerSocket
和端口。 在这两种情况下,端口都是 0 到 65535 之间的相同数字。 所以,我们决定将我们的client
连接到我们的server
:
client
使用我们server
已知 IP 和端口创建他的Socket clientSocket
对象。
server
使用他的ServerSocket.accept()
方法收到传入的连接请求,该方法生成新的Socket newClientSocket
对象(仍在server
端 (!) )。
进一步的数据交换通过clientSocket
和newClientSocket
对象进行(不在clientSocket
和ServerSocket
之间)。
这是理解基本连接过程的几乎完美的图片(请记住,这张图片中Client
上的Socket
对象 - 相同的对象)。
完成这个简单的结构后,您需要在Client.clientSocket
和Server.newClientSocket
打开两个流来读取和写入信息。
java.net.ServerSocket
此类实现服务器套接字。 服务器套接字等待通过网络传入的请求。 它根据该请求执行一些操作,然后可能将结果返回给请求者。
套接字
此类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。
ServerSocket 又是一个具有服务器端点附加功能的 Socket。 服务器功能包括侦听端口和接受传入连接等...
创建ServerSocket
以bind
到端口并listen
来自客户端的connect
。 因此,服务器只等待对话而不启动对话。
创建ClientSocket
以connect
到listen
服务器。 客户端发起连接。
示例:以呼入呼叫中心为例。 这些服务是服务器。 他们不发起呼叫,而是等待来自客户的呼叫。 一旦呼叫进入,他们就可以进行双向对话。
因为它是阅读的内容已经由服务器发送给您。
Socket
用于客户端, ServerSocket
用于服务器端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.