2013-08-12 2 views
0

Вот мой фрагмент кода:Почему мой java-сокет не может закончить сам?

  BufferedInputStream in = new BufferedInputStream(
        server.getInputStream()); 
      LittleEndianDataInputStream ledis = new LittleEndianDataInputStream(
        in); 

      byte[] contents = new byte[1024]; 

      System.out.println("45"); 
      int bytesRead = 0; 
      String s; 
      while ((bytesRead = ledis.read(contents)) > 0) { 
       System.out.println(bytesRead); 
       s = new String(contents, 0, bytesRead); 
       System.out.print(s); 
      } 

      System.out.println("53"); 

После моего клиента отправить сообщение в розетку, и программа успешно распечатать результат, но я не могу напечатать 53, пока я не остановить подключение клиентского сокета. Что мне делать, чтобы справиться с этим? Мой клиент - это асинхронный сокет. Благодарю.

+1

вызов 'flush()' в потоке –

ответ

1

Ваш контур while-loop, когда он получает EOF и EOF, отправляется со стороны записи, всякий раз, когда вы закрываете сокет или - более изящным - выключение выхода. Итак, в вашем случае ваш цикл while завершится, когда посылающая сторона вызовет socket.shutdownOutput(). Это закрывает только выходной поток и помещает EOF в конец данных.

Я уверен, что это обсуждалось ранее, к сожалению, я больше не могу найти вопрос, чтобы просто связать. С верхней части моей головы сторона записи должна выполнить следующий код, чтобы закрыть соединение изящно:

// lets say the output stream is buffered, is namend bos and was created like this: 
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 

// Then the closing sequence should be 
bos.flush(); 
socket.shutdownOutput(); // This will send the EOF to the reading side 

// And on the reading side at the end of your code you can close the socket after getting the EOF 
.... 
      while ((bytesRead = ledis.read(contents)) > 0) { 
      System.out.println(bytesRead); 
      s = new String(contents, 0, bytesRead); 
      System.out.print(s); 
     } 

     System.out.println("53"); 
     server.close; // <- After EOF was received, so no Exception will be thrown 
Смежные вопросы