2016-06-08 7 views
0

Прошу прощения, потому что я не могу придумать лучшего названия. I имеет клиент-серверную программу, написанную на Java, что сервер отправить строку, заканчиваться символом новой строки \n клиента считываются из socket.getInputStream(), если вход имеет следующую строку с помощью сканераJava - Использование чтения сканера из Socket InputStream

на стороне сервера

ServerSocket serverSocket = new ServerSocket(PORT); 
Socket socket = serverSocket.accept(); 
PrintWrite send = new PrintWriter(socket.getOutputStream); 
send.print("Server has succeeded to proccess your request \n" + show(ID)); 
send.flush(); 

Show (ID) - это функция, которая возвращает строку, которая уже содержит следующий символ строки. на стороне клиента

Socket socket = new Socket(HOST,PORT); 
Scanner read = new Scanner(socket.getInputStream); 
public Boolean ServerResponse(){ 
    System.out.println("please wait"); 
    Boolean result=false; 
    while(true){ 
     if(read.hasNextLine()){ 
      System.out.println("has next"); 
      String msg = read.nextLine(); 
      System.out.println(msg); 
      if(msg.contains("succeeded")){ 
       result = true; 
      } 

     }else{ 
      System.out.println("finished reading server respone"); 
      return result; 
     } 

    } 
} 

, когда я попытался запустить это. "finished reading server respone" никогда не печатается и нет has next после того, как будет напечатана последняя строка, отправленная Server, в которой предполагается, что символ следующей строки отсутствует. Однако блок else никогда не выполняется. Странно, когда я заканчиваю Server, он печатается. Может ли кто-нибудь объяснить это мне и что я должен сделать, что мне не нужно прерывать сервер для печати этой строки?

ответ

0

Из Scanner#hasNextLine документации:

Возвращает истину, если есть еще одна линия на входе этого сканера. Этот метод может блокироваться при ожидании ввода. Сканер не делает заранее мимо любого входа.

Это означает, что он будет возвращать true, если следующая строка доступна, не, что он будет возвращать false, когда нет следующей строки не доступен для обработки. Тем не менее, он может ожидать появления еще одной строки.

+0

Значит, он возвращает только false, если есть вход, но без следующей строки. Без ввода он будет блокироваться? Спасибо – aukxn

1

Возможно, вы не закрываете PrintWriter на стороне сервера.

Как Socket и PrintWriter реализует интерфейс для автозаполнения, вы можете использовать попытку с блоком ресурсов, чтобы закрыть ресурсы, когда сервер закончил с ними.

try (Socket socket = serverSocket.accept(); 
    PrintWriter send = new PrintWriter(socket.getOutputStream);) { 
    send.print("Server has succeeded to proccess your request \n" + show(ID)); 
} 

При вызове метода hasNextLine в сканере на стороне клиента, он блокирует ожидание ввода.

Если вы завершите работу своего сервера, поток закрыт, и метод hasNextLine возвращает false, а на клиенте отображается finished reading server response.

+0

Итак, каждый раз, когда Сервер посылает что-то, он должен закрыть PrintWriter, и в следующий раз он должен создать новый PrintWriter. Закрывает ли PrintWriter закрытие OuputStream? – aukxn

+0

Ваш клиент блокируется в методе 'hasNextLine', ожидающем ввода с сервера. Если сервер не собирается отправлять что-либо еще и закрывать поток, клиент будет печатать «обработанный обработанный сервер чтения». Если ваш сервер отправит больше данных, вы не должны закрывать поток, и я предполагаю, что ваш клиент в порядке, ожидая большего ввода. –