2014-09-12 70 views
0

我想实现一个方法来检查服务器是否仍然运行。我使用套接字在服务器和客户端之间进行通信。我的目标是向服务器打印换行符以测试它是否仍然运行,如果它不是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

看起来正确的,

while(true){ 
     try{ 
      testConenction(contentSocket); 
      readResponse(); 

这里readResponse()在循环中被设置(在看不到尽头)。相反,也许包括等待/睡眠并尝试另一种方式。

如果您得到“来自服务器的响应:”,也许检查userInput是否为空/空,然后退出。

+0

从技术上讲,没有用户输入,它与客户端的联合服务器 – zeelo 2014-09-12 13:00:44

+0

我的错误,我应该更清楚,检查这个用户输入是否为空: private static void readResponse()throws IOException {userIQ; – 2014-09-12 13:01:11

+0

我明白你的意思了,但是如果userInput是空的,我应该打异常(5)。 readResponse()主要功能是检索一个HTTP 200 – zeelo 2014-09-12 13:10:17

0

一旦连接已经建立了一个布尔标志应当设置为true,这将表示到服务器的连接已经建立。如果标志被发现是真的,那么我们将不再测试连接。

另外我想知道,如果我们在testConenction方法中捕获IOException,那么异常将不会传播到调用方法。

+0

通过这个你的意思是交换而(真)与说,而(连接),其中连接是一个布尔值? – zeelo 2014-09-12 12:59:53

+0

是的。我认为重要的是要保持一个指标,以了解曾经建立的连接。只有这样,我们才能区分新的连接和断开连接。 – SamDJava 2014-09-12 13:01:37

+0

执行布尔值后,可悲的是我仍然得到相同的结果。 – zeelo 2014-09-12 13:06:09

0

您在两种方法中捕获异常,以便不会引发异常327,并且永远不会调用重新连接。

你不必检查你是否得到答案,它是足以发送的东西。 TCP协议(由套接字使用)将确保服务器接收数据包,否则会引发异常。

+0

这解释了一些奇怪的错误 – zeelo 2014-09-12 13:01:46