客户端无限循环

时间:2014-09-12 12:51:43

标签: java sockets client

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

3 个答案:

答案 0 :(得分:0)

建立连接后,应将布尔标志设置为true,这表示已建立与服务器的连接。如果发现该标志为真,那么我们将不再测试该连接。

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

答案 1 :(得分:0)

看起来正确,

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

这里readResponse()设置在一个循环中(没有结束)。相反,可能包括等待/睡眠并尝试其他方式。

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

答案 2 :(得分:0)

您捕获两个方法中的异常,以便不能抛出异常327并且永远不会调用重新连接。

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