В чем разница между Socket и ServerSocket? - PullRequest
31 голосов
/ 05 января 2010

Если Socket представляет сторону клиента, а ServerSocket представляет сторону сервера, почему Socket.read читает данные со стороны сервера? Я действительно запутался, не могли бы вы объяснить это мне?

Ответы [ 9 ]

24 голосов
/ 01 июля 2015

(я публикую этот ответ, потому что я всегда чувствую, что логика должна быть правильной.)

Предлагаю взглянуть на следующий пример.

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

По общему признанию, при осуществлении связи по TCP / IP вся необходимая информация может быть предоставлена ​​только классом Socket для единственной цели связи. Неважно, на стороне сервера или на стороне клиента.

Как видно из приведенной выше ссылки, на стороне сервера использует следующий код для получения собственного экземпляра Socket. То есть еще один сокет создается на другом порту.

enter image description here

Затем сервер использует этот экземпляр Socket для связи с клиентом.

И чтобы сделать картину завершенной, ниже приведен фрагмент кода, показывающий clien t Socket instance.

enter image description here

Так что, если 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.

9 голосов
/ 05 января 2010

почему socket.read читает данные со стороны сервера

Поскольку он читает данные , отправленные сервером через сеть , он не читает непосредственно файловую систему сервера или восстанавливает (db, ram или что-то в этом роде) чтение данных, которые уже были обработаны ServerSocket.

Думайте о Socket как о своем веб-браузере, а о ServerSocket как об удаленном веб-сервере.

Когда вы запрашиваете изображение, страницу и т. Д., Веб-сервер (ServerSocket) записывает байты клиенту, в свою очередь, клиент должен прочитать их (чтобы узнать, что веб-сервер отправил правильно?) И обработать их, отображая их до конечного пользователя.

То же самое произошло с ServerSocket / Socket, но на более низком уровне. Сокет считывает информацию из ServerSocket.

Имеет ли это смысл?

8 голосов
/ 03 марта 2014

java.net.ServerSocket

Этот класс реализует серверные сокеты. Сокет сервера ждет просит войти по сети. Он выполняет некоторые операции на основе по этому запросу, а затем, возможно, возвращает результат запрашивающей стороне.

java.net.Socket

Этот класс реализует клиентские сокеты (также называемые просто "сокетами"). сокет является конечной точкой для связи между двумя машинами.

6 голосов
/ 01 июля 2015

Прежде всего, давайте выясним, как выглядит Socket: в общем случае Socket - это объединение IP и порта через :, например: 127.0.0.1:8080.

Итак, вы решили создать клиент-серверное приложение, используя Socket. Там нет ничего слишком сложного. Вот краткое объяснение о создании связи между client и server:

  1. Прежде всего, давайте выясним тот факт, что наши client имеют свой собственный Socket и знают server IP-адрес и порт. Для server предусмотрены только ServerSocket и порт. В обоих случаях порты имеют одинаковые номера от 0 до 65535.
  2. Итак, мы решили подключить наш client к нашему server:

    • client создает его Socket clientSocket объект с известным IP и портом нашего server.

    • server получил входящий запрос на соединение с его методом ServerSocket.accept(), который генерирует новый объект Socket newClientSocket (все еще на стороне server (!)).

    • Дальнейший обмен данными происходит через объекты clientSocket и newClientSocket (не между clientSocket и ServerSocket).

Здесь - почти идеальная картинка для понимания основного процесса подключения (имейте в виду, что Socket объект на Client на этом рисунке - те же объекты).

После того, как вы создали эту простую структуру, вам нужно открыть два потока на обеих сторонах Client.clientSocket и Server.newClientSocket для чтения и записи информации.

1 голос
/ 12 мая 2017

ServerSocket создается для bind для порта и listen для connect от клиента. Итак, сервер просто ждет разговора и не запускает его.

ClientSocket создан для connect на listen сервере. Клиент инициирует соединение.

Пример. В качестве примера рассмотрим центр входящих вызовов. Эти сервисы являются серверами. Они не инициируют звонок, а ждут звонка от клиентов. Как только вызовы сделаны, они могут вступить в двустороннюю беседу.

1 голос
/ 05 января 2010
1 голос
/ 05 января 2010

ServerSocket - это снова Socket с дополнительными функциями конечной точки сервера. Функции сервера включают в себя прослушивание порта и прием входящего соединения и т. Д. *

0 голосов
/ 16 апреля 2010

Socket для клиентской стороны и ServerSocket для серверной.

0 голосов
/ 05 января 2010

Поскольку он читает то, что было отправлено вам сервером .

...