我试图实现一种方法来检查服务器是否仍在运行。我使用套接字在服务器和客户端之间进行通信。我的目标是在服务器上打印一个换行符,以测试它是否仍在运行,如果不是抛出IOException并且客户端将进入重新连接过程。
我的问题是在我终止服务器终端后,我的客户端进入无限循环的打印"来自服务器的响应:"什么时候不应该。
客户端代码:
private static void readResponse() throws IOException{
String userInput;
try{
BufferedReader stdIn = new BufferedReader(new InputStreamReader(contentSocket.getInputStream()));
System.out.println("Response from server:");
while ((userInput = stdIn.readLine()) != null) {
System.out.println(userInput);
}
} catch(IOException e) {
System.err.println("Something went wrong (5)");
}
}
private static void testConenction( Socket socket ) throws IOException{
try{
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("\n");
writer.flush();
writer.close();
} catch(IOException e) {
System.err.println("Something went wrong (355)");
}
}
try{
//Connection stuff
while( true ){
try{
testConenction(contentSocket);
readResponse();
} catch(IOException e) {
System.err.println("Something went wrong (327)");
closeSocket(contentSocket);
System.out.println("Trying to re-establish connection");
reconnect();
}
}
答案 0 :(得分:0)
建立连接后,应将布尔标志设置为true,这表示已建立与服务器的连接。如果发现该标志为真,那么我们将不再测试该连接。
另外我想知道如果你在testConenction方法中捕获IOException,那么Exception将不会传播到调用方法。
答案 1 :(得分:0)
看起来正确,
while( true ){
try{
testConenction(contentSocket);
readResponse();
这里readResponse()设置在一个循环中(没有结束)。相反,可能包括等待/睡眠并尝试其他方式。
如果您收到“来自服务器的响应:”,可以检查userInput是否为空/空,然后退出。
答案 2 :(得分:0)
您捕获两个方法中的异常,以便不能抛出异常327并且永远不会调用重新连接。
你不必检查你是否得到答案,这足以发送一些东西。 TCP协议(由套接字使用)将确保服务器接收数据包,否则将引发异常。