Связь Socket и ServerSocket неясна - PullRequest
       49

Связь Socket и ServerSocket неясна

1 голос
/ 25 февраля 2020

Я бы хотел, чтобы кто-то выяснил ошибочное мнение, которое, как мне кажется, есть. Я читаю о программировании сокетов на Java и не совсем понимаю, каков реальный ход вещей. Вот мои две возможные интерпретации для сценария ниже.

Client

  1. Экземпляр сокета создан Socket s = new Socket("server ip", 9999);

Server

  1. ServerSocket создан для приема сообщения ServerSocket ss = new ServerSocket(9999);
  2. Ожидание сообщения Socket sss = ss.accept();


Как будет выглядеть диаграмма после Программа сервера принимает?

КРАСНЫЕ СТРЕЛКИ представляют окончательный поток СВЯЗИ

Будут ли соединения после того, как сервер принимает клиента, выглядеть так? (Клиент связывается с сокетом, который создал сервер, а не с сокетом сервера)

diagram1

Или диаграмма будет выглядеть так? (Клиент продолжает взаимодействовать с сервером через сокет сервера. Сервер осуществляет связь обратно через сокет, созданный при принятом соединении.)

enter image description here

1 Ответ

1 голос
/ 25 февраля 2020

Сокет - это абстракция для соединения между двумя хостами (клиентом и сервером). Как только соединение установлено, хосты клиента и сервера получают потоки ввода и вывода из сокета и используют эти потоки для отправки данных друг другу. (Подробнее см. здесь ).

Эта диаграмма может вам помочь. enter image description here

На клиенте:

  • Socket socket = new Socket("server ip", 9999);

Это устанавливает соединение по сети.

  • InputStream in = socket.getInputStream();

Как только соединение установлено, получить входной поток из сокета для чтения данных.

  • OutputStream out = socket.getOutputStream(); Использовать вывод поток из соединения сокета для записи данных.

На сервере:

  • ServerSocket ss = new ServerSocket(9999);

Инициирование прослушивающего сокета TCP (сервер сокет), который привязан к известному локальному порту, который прослушивает и принимает подключения от клиентов.

  • Socket socket = ss.accept();

Блокирует текущий поток, пока клиент не подключится, и не возвратит подключенный разъем принятого подключения. Обратите внимание, что здесь возвращается тот же тип java. net .Socket, что и для клиента. Подобно клиенту, сервер может использовать OutputStream и InputStream из сокета для записи и чтения данных.

См. здесь для более подробной информации.

...