首页 > 解决方案 > 即使服务器停止,Clinet 也不会停止发送消息

问题描述

我正在开发一个必须定期发送心跳消息的 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);
     }
}

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

标签: javasockets

解决方案


写入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()方法还会在检查是否发生错误之前刷新流。

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


推荐阅读