2013-10-05 4 views
4

Из Socket документации:Отбросив вход из гнезда

shutdownInput

public void shutdownInput() 
        throws IOException 

мест входной поток для этого разъема на "конец потока". Любые данные, отправленные со стороны входного потока сокета, подтверждаются и затем молча отбрасываются.

Если вы прочитали из входного потока сокета после вызова shutdownInput() в сокете, поток вернет EOF.

Для того, чтобы проверить взаимодействие между клиентами на сервере, я написал некоторый клиент ботов. Эти боты генерируют несколько случайных запросов клиентов. Поскольку они только записываются на сервер, им не нужен поток ввода, им не нужно читать обновления, отправляемые сервером. Это основная часть кода для ботов:

private void runWriteBot(PrintWriter out) throws IOException { 
    //socket.shutdownInput(); 
    String request; 
    System.out.println("Write bot ready."); 
    while (!quit) { 
     request = randomRequest(); 
     out.println(request); 
     sleep(); 
    } 
} 

Если я раскомментировать shutdownInput, генерируется исключение в клиентский обработчик сервера:

Подключение сброса

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

  1. Могу ли я просто игнорировать то, что посылает сервер, или мне нужно утешить то, что поступает во входной поток?

  2. Есть ли automagic Способ сделать это, или мне нужно регулярно читать и игнорировать?

ответ

4

Поведение при вызове shutdownInput() зависит от платформы.

  1. BSD Unix будет молча отбрасывать любые дополнительные данные.
  2. Linux будет поддерживать буферизацию ввода, который в конечном итоге заблокирует отправителя или заставит его получить EAGAIN/EWOULDBLOCK, если он находится в режиме без блокировки.
  3. Windows перезагрузит соединение, если поступят какие-либо дополнительные данные.

Это определяется платформой, а не Java.

Я не вижу необходимости вызывать shutdownInput() в большинстве ситуаций. Единственное, что действительно полезно, это разблокировать чтение. В вашей ситуации вам придется прочитать ответы сервера.

Смежные вопросы