即使服务器已停止,Clinet也不会停止发送消息

时间:2018-07-26 05:34:29

标签: java sockets

我正在使用Java客户端,该客户端必须定期发送心跳消息。我正在使用java.net.Socket进行工作。我的问题是,即使服务器已停止,客户端也继续发送消息而没有给出任何异常。
我阅读了各种关于stackoverflow的问题,但是找不到实现的答案。我读到,找到服务器启动的唯一方法是尝试发送消息。但是在这里我看不到这样做的方法。
这是我班的样子。

public void process() {
    sendMessage(HEART_BEAT);
}

public void start(String serverAddress, int port) throws IOException {
    this.serverAddress = serverAddress;
    this.port = port;
    if (isConnected) {
        LOGGER.info("Already connected");
        return;
    }

    socket = new Socket(serverAddress, port);

    out = new PrintWriter(socket.getOutputStream(), true);
}

private void sendMessage(String message) {
     out.print(message + END_OF_MESSAGE);
     out.println();
}

这是我的主要方法的样子,

public static void main(String args[]) {
     Client client=new Client();
     client.start("127.0.0.1", 900);
     while(true) {
          client.process();
          Thread.sleep(2000);
     }
}

如何实现一种识别服务器何时停止的方法?

2 个答案:

答案 0 :(得分:1)

PrintWriter发出警告时可能不会引发任何异常,但这并不意味着它没有在错误上运行。基础的OutputStream仍会引发异常,但它会被内部捕获并处理。
原始的异常和信息可能会丢失,但是PrintWriter#checkError()方法仍然提供了一种方法来检查某事是否出错。
我的建议是,向您的sendMessage方法中添加一些代码行:

private void sendMessage(String message) {
     out.print(message + END_OF_MESSAGE);
     out.println();
     if ( pw.checkError() )
     {
       LOG.log( Level.SEVERE, "An error occured while writing.");
       shutdown(); // <-- method with the shutdown logic (e.g. closing the socket).
     }
}

请注意,PrintWriter#checkError()方法还会在检查是否发生错误之前刷新流。

这可能不是最优雅的解决方案,但已完成工作。

答案 1 :(得分:1)

丢掉PrintWriter。它吞没了异常。使用BufferedWriter,不要使用。发送时遇到异常,请关闭套接字。