我开发了一个向客户端发送请求的客户端。当请求将被发送时,将从服务器听到的客户端启动一个线程。出于模拟目的,我阻止了服务器的响应,因此线程将运行并尝试从服务器收听。但我的线程没有反应。这是一些代码:
void getResponse(){
System.out.println("###always hearing###");
BufferedReader bStreamReader=null;
try {
bStreamReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String responseLine=null;
System.out.println("--------------------------------------------");
while((responseLine=bStreamReader.readLine())!=null){
getResponse_status=true;
System.out.println("getResponse_status: "+getResponse_status);
System.out.println(responseLine);
}
System.out.println("--------------------------------------------");
System.out.println("client:reading from server finished");
bStreamReader.close();
System.out.println("###finish hearing###");
//System.exit(0);
} catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
//run method of thread
getResponse();
}
//
getResponse() - 方法将在while循环中被阻止。通常,如果服务器不发送任何内容,则变量responseLine将等于null。这意味着while循环不会被执行,因为执行的条件不是真的。但getResponse()将在while循环中被阻止。我确定服务器什么都不发送。那么为什么我的程序在while循环中被阻止了?
答案 0 :(得分:1)
readline阻塞,直到收到一些数据。当它收到end-of-input
个字符时,它会返回null
并跳出循环。当你发送任何东西时,它一直在等待这是正确的。
请参阅https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html
readLine方法等待,直到服务器回显信息 到EchoClient。当readline返回时,EchoClient打印出 信息到标准输出。
while循环继续,直到用户键入输入结束 字符。
你的情况几乎一样。从服务器发回一些东西,看它是否有所不同。我相信它确实如此。
修改强>
我的建议是给客户。在您的代码中执行以下操作:
socket.setSoTimeout(5000); // Set read timeout to 5 seconds
在致电此行之前:
bStreamReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
执行此操作后,如果服务器在5秒内没有响应,您将获得java.net.SocketTimeoutException: Read timed out
异常,从而打破周期。如果将其括在try-catch
中,那么就完成了。