Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Socket和ServerSocket的区别是什么?_Java_Sockets_Serversocket - Fatal编程技术网

Java Socket和ServerSocket的区别是什么?

Java Socket和ServerSocket的区别是什么?,java,sockets,serversocket,Java,Sockets,Serversocket,如果Socket表示客户端,ServerSocket表示服务器端,为什么Socket.read从服务器端读取数据?我真的很困惑,你能给我澄清一下吗?因为它正在读取服务器发送给你的内容。ServerSocket又是一个具有server endpoint附加功能的套接字。服务器功能包括监听端口和接受传入连接等 为什么socket.read从服务器端读取数据 由于它正在读取服务器通过网络发送的数据,因此它没有直接读取服务器文件系统或资源(db、ram或其他类似内容),而是在读取已由ServerSock

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

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

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

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

由于它正在读取服务器通过网络发送的数据,因此它没有直接读取服务器文件系统或资源(db、ram或其他类似内容),而是在读取已由ServerSocket处理的数据

将套接字视为web浏览器,将ServerSocket视为远程web服务器

当您请求图像、页面等时,Web服务器(ServerSocket)将字节写入客户端,而客户端则必须读取字节(以了解Web服务器正确发送了什么?),并通过向最终用户显示字节来处理字节

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


这有意义吗?

看一看

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

java.net.ServerSocket

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

java.net.Socket

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

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

我建议你看看下面的样品

诚然,在执行TCP/IP通信时,
Socket
类可以仅为通信目的提供所有必要的信息。无论是在服务器端还是客户端

从上面的链接可以看到,服务器端使用以下代码获取自己的
套接字
实例。也就是说,在同一服务器本地端口和客户端端口对上创建另一个
套接字

然后,服务器使用这个
Socket
实例与客户机对话

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

那么如果
Socket
已经可以完成这一切,为什么我们还需要
ServerSocket

这是因为TCP/IP协议上的通信工作模式

当两个程序通过TCP/IP进行通话时,通常一个会被动地监听/等待
,另一个会主动地连接到它

因此,您可以看到,在通信的这个
开始阶段
,双方的行为非常不同。因此,使用了两个不同的类来反映这种差异。

  • Socket
    类封装了活动端的行为。(又称客户)
  • ServerSocket
    类封装被动端(又称服务器)的行为
一旦
ServerSocket
完成其侦听任务并
检测到一个传入连接,它将
accept()
它并创建一个新的
Socket
实例以方便通信

类似地,在
java.nio
包中,您会发现
ServerSocketChannel
SocketChannel
类。然而,他们的行为是这样的:

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

因此,在某种程度上,我同意@JohnK在评论中指出的观点,
这或多或少只是6个字母的差异

首先,让我们澄清一下什么是
Socket
看起来像什么:在一种常见情况下,
Socket
是通过
连接IP和端口,例如:
127.0.0.1:8080

所以,您决定使用
Socket
创建客户机服务器应用程序。没什么太复杂的。下面是有关在
客户端
服务器
之间建立连接的简短说明:

  • 首先,让我们澄清这个事实,我们的
    客户机
    有自己的
    套接字
    ,并且知道
    服务器
    IP地址和端口。对于
    服务器
    仅提供了
    服务器套接字
    和端口。在这两种情况下,端口在0和65535之间是相同的数字
  • 因此,我们决定将
    客户端
    连接到
    服务器

    • client
      使用我们的
      服务器的已知IP和端口创建他的
      Socket-clientSocket
      对象

    • server
      通过他的
      ServerSocket.accept()
      方法获得了传入的连接请求,该方法生成了新的
      Socket-newClientSocket
      对象(仍在
      服务器端(!))

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

  • 对于理解基本连接过程来说,这几乎是一幅完美的图片(请记住,
    Socket
    对象位于
    Client
    上,在这张图片中,是相同的对象)


    完成这个简单的结构后,您需要在
    客户端.clientSocket
    服务器上打开两个流。newClientSocket
    侧用于读取和写入信息。

    服务器套接字
    创建为
    绑定到端口并