(я публикую этот ответ, потому что я всегда чувствую, что логика должна быть правильной.)
Предлагаю взглянуть на следующий пример.
http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
По общему признанию, при осуществлении связи по TCP / IP вся необходимая информация может быть предоставлена только классом Socket
для единственной цели связи. Неважно, на стороне сервера или на стороне клиента.
Как видно из приведенной выше ссылки, на стороне сервера использует следующий код для получения собственного экземпляра Socket
. То есть еще один сокет создается на другом порту.
Затем сервер использует этот экземпляр Socket
для связи с клиентом.
И чтобы сделать картину завершенной, ниже приведен фрагмент кода, показывающий clien t Socket
instance.
Так что, если Socket
может все это сделать, зачем нам все еще нужен ServerSocket
?
Это из-за рабочей парадигмы связи по протоколу TCP / IP.
Когда две программы взаимодействуют по TCP / IP, обычно одна будет пассивно прослушивать / ждать на <IP:port>
, а другая активно подключится к нему.
Итак, вы можете видеть, что в этом самом starting phase
сообщении две стороны ведут себя совершенно по-разному. Таким образом, 2 разных класса используются для отражения этой разницы.
Socket
класс инкапсулирует поведение активной стороны. (a.k.a. клиент)
ServerSocket
класс инкапсулирует поведение пассивной стороны (например, сервера)
Как только ServerSocket
завершит свою задачу прослушивания и detected
входящее соединение, он accept()
установит его и создаст новый экземпляр Socket
для облегчения связи.
Аналогично, в пакете java.nio
вы найдете классы ServerSocketChannel
и SocketChannel
. И все же они ведут себя так:
ServerSocketChannel -------------> SocketChannel
accept()
Так что, в некоторой степени, я согласен с @JohnK, как он указал в комментарии, it's more or less just a 6-letter difference
.