我正在使用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);
}
}
如何实现一种识别服务器何时停止的方法?
答案 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
,不要使用。发送时遇到异常,请关闭套接字。