Как ServerSocket принимает Socket после того, как он уже подключен? - PullRequest
0 голосов
/ 07 февраля 2019

Я понял, что вы можете написать на Socket, если он не был принят ServerSocket.Когда я звоню ServerSocket.accept(), он автоматически получает подключенный Socket без необходимости повторного connect().

public static void main(String[] args)
{
    ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(0);
    int boundPort = serverSocket.getLocalPort();
    String host = serverSocket.getInetAddress().getCanonicalHostName();

    Socket socket = new Socket(host, boundPort);
    write("Hi!"); // writes to socket's BufferedOutputStream

    Socket acceptedSocket = serverSocket.accept();
    read(); // reads and prints acceptedSocket's BufferedInputStream
}

Вывод:

Hi!

Не только Socket принято, но сообщение также выводится, хотя я написал OutputStream до accept().Я пытался смотреть на исходный код, но это было трудно понять.Итак, мой вопрос, каков процесс для accept()?Есть ли где-нибудь буфер подключенных Sockets?

Кроме того, как работает запись в OutputStream?Когда именно отправляются записанные данные по сети?

Спасибо!

edit: Получив ответ на этот вопрос, я нашел другое объяснение от man 2 accept в Linux.

1 Ответ

0 голосов
/ 26 февраля 2019

Это то, что происходит на самом деле.

  1. Открывает / связывает сокет сервера
  2. Создает сокет A, соединяется с сокетом сервера.Сокет A наполовину подключен в ожидании принятия на сервере.
  3. Запись данных в буфер Socket A;ничего не передается, потому что оно на самом деле не подключено.
  4. Примите сокет A на сокете сервера.
  5. Буферизованные данные в сокете A передаются на сервер.
  6. Переданные данныесчитывается на сервере.
...