2016-06-08 70 views
0

我很抱歉,因为我想不出任何更好的标题。 我已经用Java编写的服务器 - 客户端程序,服务器发送一个新的行字符\n客户从socket.getInputStream()读取结束一个字符串,如果输入具有通过使用扫描仪Java - 使用扫描仪从套接字读取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; 
     } 

    } 
} 

当我试图运行这个。在由Server发送的最后一行发送之后,"finished reading server respone"从不被打印并且没有has next,其假定没有下一行字符。但是else块永远不会执行。奇怪的是,当我终止Server时,它被打印出来。任何人都可以向我解释这一点,我必须做什么,我不需要终止打印该行的服务器?

回答

0

Scanner#hasNextLine文件:如果在此扫描器的输入另一行

返回true。 此方法可能会在等待输入时阻塞。扫描仪不会通过任何输入前进 。

意味着它将返回true如果下一行是可用的,这样它会返回false当没有下一行可用于处理。不过,它可能正在等待另一条线出现。

+0

因此,这意味着只有在有输入但没有下一行时才返回false。对于没有输入它会阻止?谢谢 – aukxn

1

您可能没有关闭服务器端的PrintWriter。

由于SocketPrintWriter实现了自动关闭接口,您可以尝试使用资源块关闭资源时,服务器已完成与他们。

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'方法阻塞,等待来自服务器的输入。如果服务器不再发送任何东西并关闭流,客户端将打印“完成读取服务器响应”。如果你的服务器要发送更多的数据,你不应该关闭流,我猜你的客户端可以等待更多的输入。 –