我很抱歉因为我想不出任何更好的头衔。
我有一个用java编写的服务器 - 客户端程序服务器发送一个字符串,该字符串以新行号\n
结束,客户端从socket.getInputStream()
读取,如果使用扫描器输入下一行
在服务器端
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 :(得分:1)
您可能没有关闭服务器端的PrintWriter。
当Socket
和PrintWriter
实现自动分解接口时,您可以使用try with resources块在服务器完成后关闭资源。
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
。
答案 1 :(得分:0)
来自Scanner#hasNextLine文档:
如果此扫描仪的输入中有另一行,则返回true。 此方法可能在等待输入时阻塞。扫描仪没有 超越任何输入。
意味着如果下一行可用,它将返回true
,不,当没有下一行可供处理时,它将返回false
。不过,它可能正在等待另一条线出现。