(我发布这个答案,因为我一直认为使逻辑正确很重要。)
我建议你看看下面的例子。
诚然,在进行TCP / IP通信时,所有必要的信息都可以由Socket类提供,仅用于通信。无论是在服务器端还是在客户端。
从上述链接可以看出,服务器端使用以下代码来获取自己的Socket实例。也就是说,在另一个端口上创建另一个套接字。
然后,服务器使用这个Socket实例来与客户端通信。
为了使图片完整,下面的代码片段显示客户端的Socket实例。
所以如果Socket可以这样做,为什么还需要ServerSocket?
这是因为通过TCP / IP协议进行通信的工作模式。
当2个程序通过TCP / IP通话时,通常会在< IP:端口>上被动地监听/等待另一个将主动连接到它。
所以你可以看到,在通信的这个开始阶段,双方都有非常不同的行为。所以使用两个不同的类来反映这种差异。
> Socket类封装了活动端的行为。 (a.k.a.客户)
> ServerSocket类封装被动方的行为(a.k.a.服务器)
一旦ServerSocket完成其侦听任务并检测到传入连接,它将接受()并创建一个新的Socket实例以方便通信。
同样,在java.nio包中,您将会找到ServerSocketChannel和SocketChannel类。而且他们的行为还是这样的:
ServerSocketChannel -------------> SocketChannel
accept()
所以,在某种程度上,我同意@JohnK他在评论中指出,或多或少只是一个6个字母的区别。