java - 即使服务器停止,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);
}
}
如何实现一种方法来识别服务器何时停止?
解决方案
写入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()
方法还会在检查是否发生错误之前刷新流。
它可能不是最优雅的解决方案,但它完成了工作。
推荐阅读
- jquery - 我怎样才能从当前的 div 上课
- jhipster-registry - JHipster Registry 如何配置 git 用户名和密码
- reactjs - 防止 Material-UI InputLabel 移动到 Select 组件的左上角
- c# - 有没有办法将当前 url 从 Map Route 更改为另一个 Map Route?
- php - 如何更改/重置 PHP 数组类型?
- angular - 使用模拟按钮单击测试函数调用,但代码覆盖率表明它没有被测试
- reactjs - 如何在 React 应用程序中设置生产环境变量?(托管在 Netlify 上)
- android - 使用 alignParentBottom 属性查看键盘打开时覆盖 Edittext
- vue.js - 如何修复功能
- swift - 以 = {} () Swift 结尾的变量的名称是什么?