Socket和ServerSocket有什么区别?

时间:2010-01-05 06:30:44

标签: java sockets serversocket

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

9 个答案:

答案 0 :(得分:24)

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

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

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

不可否认,在进行TCP / IP通信时,仅Socket类可以提供所有必要信息,仅用于通信。无论是在服务器端还是客户端。

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

enter image description here

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

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

enter image description here

因此,如果Socket已经可以完成所有操作,为什么我们仍然需要ServerSocket

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

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

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

  • Socket类封装了活动方的行为。 (a.k.a.客户)
  • ServerSocket类封装被动方的行为(a.k.a.服务器)

ServerSocket完成其侦听任务并detected传入连接后,它会accept()它并创建一个新的Socket实例以方便通信。

类似地,在java.nio包中,您会找到ServerSocketChannelSocketChannel个类。他们仍然表现得像这样:

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

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

答案 1 :(得分:9)

  

为什么socket.read从服务器端

读取数据

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

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

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

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

有意义吗?

答案 2 :(得分:7)

<强> java.net.ServerSocket中

  

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

<强>的java.net.Socket

  

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

答案 3 :(得分:5)

首先,让我们澄清一下IS Socket的样子:在一般情况下,Socket是通过:连接IP和端口的连接,例如:{{1} }。

因此,您决定使用127.0.0.1:8080创建客户端 - 服务器应用程序。没有什么太复杂的了。以下是关于在Socketclient之间建立联系的简短说明:

  1. 首先,让我们澄清这一事实,即我们的server拥有自己的client并知道Socket IP地址和端口。对于server,仅提供server和端口。在这两种情况下,端口都是0到65535之间的相同数字。
  2. 因此,我们决定将ServerSocket与我们的client相关联:

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

    • server使用server方法获取了传入连接请求,该方法会生成新的ServerSocket.accept()对象(仍位于Socket newClientSocket方(!))。

    • 进一步的数据交换通过serverclientSocket个对象(不在newClientSocketclientSocket之间)。

  3. Here几乎是了解基本连接过程的完美图片(请记住,此ServerSocket上的Socket对象 - 相同的对象)。

    完成这个简单的结构后,您需要在ClientClient.clientSocket两侧打开两个流来读取和写入信息。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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