Как можно создать объект сокета с помощью метода ServerSocket accept()?

#java #sockets #serversocket

#java #сокеты #serversocket

Вопрос:

После завершения I/O streams и Concurrency я решил учиться Socket programming . До сих пор я делал простой сервер-клиент. Но у меня есть небольшой вопрос о понимании того, как на самом деле создаются объекты сокетов. Надеюсь, кто-нибудь сможет дать простое объяснение, так как я новичок в этом.

Основное правило, которому я следую, заключается в том, чтобы Socket указать как IP-адрес, так и номер порта. Поэтому я бы сделал что-то вроде:

 Socket s = new Socket(StringIP, intPort);
  

Но я также столкнулся с тем, что меня смущает, и это использование accept() из класса ServerSocket.

 ServerSocket myServer = new ServerSocket(portNum);
Socket socket = myServer.accept();
  

В документе говорится, что он возвращает новый сокет после установления соединения. Достаточно справедливо. Но как он может узнать порт и IP-адрес клиента? Означает ли это, что переменный сокет содержит все данные о клиенте (имеется в виду его IP и порт)? Если да, то как он может это узнать, без того, чтобы я вручную поместил его в конструктор, как я показал в первом примере? Может кто-нибудь сказать мне, чего мне не хватает, чтобы я мог двигаться дальше?

Комментарии:

1. Почему вас интересует порт или IP-адрес клиента? Используемый порт такой же, как и серверный сокет. Что бы вы сделали с IP-адресом, если бы он у вас был?

2. @HovercraftFullOfEels Верно, этот комментарий открыл мне глаза. Но технически у него есть свой IP-адрес и порт, когда сокет создается таким образом, не так ли?

3. Сокет предназначен для простого и понятного обмена данными. Если необходимо поделиться информацией, то передайте непосредственно через сокет то, что необходимо разделить

Ответ №1:

Но как он может узнать порт и IP-адрес клиента?

Порт клиента и IP-адрес находятся в сетевых пакетах. Операционная система собирает и записывает эту информацию и передает ее в Java через результаты (грубо говоря) системных вызовов. Все это делается под капотом в машинном коде JVM. (И ядро ОС, конечно.)

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