46

如果Socket代表客户端和ServerSocket代表服务器端,为什么Socket.read要从服务器端读取数据?我真的很困惑,你能解释一下吗?

4

9 回答 9

52

(我发布这个答案是因为我总是觉得让逻辑正确很重要。)

我建议你看看下面的示例。

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包中,您会找到ServerSocketChannelSocketChannel类。而且,它们的行为是这样的:

ServerSocketChannel -------------> SocketChannel
                      accept()

所以,在某种程度上,我同意@JohnK 在评论中指出的观点,it's more or less just a 6-letter difference

于 2015-07-01T06:57:09.180 回答
12

为什么socket.read从服务器端读取数据

因为它正在读取服务器通过网络发送的数据,所以它不是直接读取服务器文件系统或资源(db、ram 或类似的东西),而是读取已经由 ServerSocket 处理的数据。

将 Socket 视为您的 Web 浏览器,将 ServerSocket 视为远程 Web 服务器。

当您请求图像、页面等时,网络服务器( ServerSocket )将字节写入客户端,然后客户端必须读取它们(知道网络服务器发送的内容对吗?)并通过将它们显示到最终结果来处理它们用户。

ServerSocket/Socket 也发生了同样的情况,但级别较低。套接字从 ServerSocket 读取信息。

是否有意义?

于 2010-01-05T06:40:11.867 回答
9

首先,让我们澄清一下 IS 的Socket样子:在常见情况下,Socket是 IP 和端口 via 的串联:,例如:127.0.0.1:8080.

因此,您决定使用Socket. 没有什么太复杂的。client以下是关于在and之间建立联系的简短说明server

  1. 首先,让我们澄清一个事实,即我们client有自己的Socket并且知道serverIP 地址和端口。因为server只提供ServerSocket和端口。在这两种情况下,端口都是 0 到 65535 之间的相同数字。
  2. 因此,我们决定将我们的连接client到我们的server

    • clientSocket clientSocket使用我们的已知 IP 和端口创建他的对象server

    • server使用他的方法获得传入的连接请求,ServerSocket.accept()该方法生成新Socket newClientSocket对象(仍然在server一边(!))。

    • 进一步的数据交换通过clientSocketandnewClientSocket对象(不在clientSocketand之间ServerSocket)进行。

是了解基本连接过程的近乎完美的图片(请记住,该图片Socket上的对象Client- 相同的对象)。

Client.clientSocket做完这个简单的结构后,需要在Server.newClientSocket两边打开两个流来读写信息。

于 2015-07-01T07:22:42.997 回答
8

java.net.ServerSocket

此类实现服务器套接字。服务器套接字等待通过网络进入的请求。它根据该请求执行一些操作,然后可能将结果返回给请求者。

java.net.Socket

此类实现客户端套接字(也称为“套接字”)。套接字是两台机器之间通信的端点。

于 2014-03-03T06:03:46.017 回答
1

看看http://java.sun.com/docs/books/tutorial/networking/sockets/

于 2010-01-05T08:07:23.677 回答
1

ServerSocket 又是一个具有服务器端点附加功能的 Socket。服务器功能包括监听端口和接受传入连接等......

于 2010-01-05T06:39:35.173 回答
1

ServerSocket被创建到bind一个端口和listen一个connect来自客户端。因此,服务器只是等待对话而不启动对话。

ClientSocket创建到connectinglisten服务器。客户端启动连接。

示例:以呼入呼叫中心为例。这些服务是服务器。他们不发起呼叫,而是等待来自客户的呼叫。一旦电话接通,他们就可以进行双向对话。

于 2017-05-12T08:11:44.063 回答
0

因为它正在读取服务器发送给您内容。

于 2010-01-05T06:32:13.100 回答
0

Socket用于客户端,ServerSocket用于服务器端。

于 2010-04-16T14:38:19.593 回答