Socket和ServerSocket有什么区别?

sev*_*jan 33 java sockets serversocket

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

smw*_*dia 30

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

我建议你看一下下面的例子.

http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

无可否认,在进行TCP/IP通信时,所有必要的信息都可以由Socket班级单独提供,仅用于通信目的.无论是在服务器端还是客户端.

从上面的链接可以看出,服务器端使用以下代码来获取自己的Socket实例.也就是说,在另一个端口上创建另一个套接字.

在此输入图像描述

然后,服务器使用此Socket实例与客户端通信.

为了使图片完整,下面的代码片段显示了clien t的Socket实例.

在此输入图像描述

所以,如果Socket能够做到这一切,为什么我们仍然需要ServerSocket

这是因为通过TCP/IP协议进行通信的工作范例.

当2个程序通过TCP/IP进行通信时,通常会有一个被动地监听/等待,<IP:port>而另一个将主动连接到它.

所以你可以看到,在这种starting phase沟通中,双方的行为截然不同.因此,使用2个不同的类来反映这种差异.

  • Socketclass封装了活动端的行为.(又名客户)
  • ServerSocket class封装了被动端(也称为服务器)的行为

一旦ServerSocket完成了其侦听任务和detected传入连接,它就会accept()创建一个新Socket实例以方便通信.

同样地,在java.nio包装中,你会发现ServerSocketChannelSocketChannel上课.而且,他们仍然表现得像这样:

ServerSocketChannel -------------> SocketChannel
                      accept()
Run Code Online (Sandbox Code Playgroud)

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

  • 不要以图像形式提供信息,可以是文本。 (2认同)
  • @KarlRichter用于更好的高光。 (2认同)

Osc*_*Ryz 10

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

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

将Socket视为Web浏览器,将ServerSocket视为远程Web服务器.

当您请求图像,页面等时,Web服务器(ServerSocket)将字节写入客户端,客户端又必须读取它们(知道Web服务器发送的是什么?)并通过将它们显示到最终来处理它们用户.

ServerSocket/Socket同样发生,但处于较低级别.套接字从ServerSocket 读取信息.

是否有意义?


Mar*_*hli 8

java.net.ServerSocket中

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

java.net.Socket中

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


小智 7

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

所以,你决定使用的是客户端 - 服务器应用程序Socket.没有什么太复杂的了.这是关于在client和之间建立连接的简短说明server:

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

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

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

    • 进一步的数据交换通过clientSocketnewClientSocket对象(不在clientSocket和之间ServerSocket)进行.

这里几乎是完美的画面,了解基本的连接过程(记住,该Socket物体在Client这幅画-相同的对象).

你做这个简单的结构之后,你需要打开两个两个流Client.clientSocketServer.newClientSocket两侧的读取和写入信息.


Noo*_*ilk 0

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