Ожидание ServerSocket accept (), чтобы перевести сокет в режим «прослушивания» - PullRequest
2 голосов
/ 29 декабря 2010

Мне нужно простое соединение клиент-сервер для реализации модульного теста.

Мои шаги:

  1. Создать тему сервера
  2. Подождите, пока поток сервера не переведет сокет сервера в режим прослушивания (serverSocket.accept ())
  3. Создать клиента
  4. Сделайте запрос, проверьте ответы

В принципе, у меня проблема с шагом # 2. Я не могу найти способ сообщить мне, когда серверный сокет переведен в состояние «прослушивания». В этом случае подойдет асинхронный вызов «accept», но java не поддерживает это (кажется, что он поддерживает только асинхронные каналы, и они несовместимы с методом «accept ()» согласно документации).

Конечно, я могу поставить простой "сон", но это не совсем решение для производственного кода.

Итак, подведем итог: мне нужно определить, когда ServerSocket был переведен в режим прослушивания без использования снов и / или опроса.

Ответы [ 2 ]

5 голосов
/ 29 декабря 2010

Сокет переводится в состояние прослушивания, как только вы создаете объект ServerSocket, а не при вызове accept.Пока вы создаете клиента после завершения работы с конструктором ServerSocket, у вас не будет проблем.Соединения будут приниматься и помещаться в очередь до тех пор, пока не будет вызван accept.

Вот некоторый код для демонстрации:

ServerSocket serverSocket = new ServerSocket(12345);
Thread.sleep(10000);
Socket socket = serverSocket.accept();

В течение этого 10-секундного интервала до вызова accept ОСКоманда netstat покажет сокет сервера в состоянии «LISTENING», и клиенты могут подключиться к нему.Если клиент подключается в течение этих 10 секунд, соединение ставится в очередь, и когда наконец вызывается метод accept, он немедленно возвращает объект Socket в очереди.

0 голосов
/ 29 декабря 2010

Почему бы не отправить один сообщение перед вызовом accept ()?

connectionAccepted = true;
loc.notify();
socket.accept();

Чтобы быть уверенным, что сокет готов, добавьте крошечный спящий код в свой "клиентский" код:

wait();
// we are here when notify is called.
Thread.sleep(10); // 10 ms
startTest();

Вы можете даже сделать лучше: создайте цикл, который пытается «пропинговать» сокет с небольшим перерывом между попытками.В этом случае вы начнете тестирование настолько быстро, насколько это возможно.

...