java - 如何在此 Java 代码之上添加心跳消息(用于 KnockKnockClient/Server)?

标签 java sockets networking

我正在研究以下基本 Java 套接字代码 (source)。这是一个 Knock-Knock-Joke 客户端/服务器应用程序。

Client ,我们照常设置套接字:

try {
  kkSocket = new Socket("localhost", 4444);
  out = new PrintWriter(kkSocket.getOutputStream(), true);
  in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
} catch( UnknownHostException uhe ){ /*...more error catching */

然后,我们只是对服务器进行读写:

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;

while ((fromServer = in.readLine()) != null) {
  System.out.println("Server: " + fromServer);
  if (fromServer.equals("bye."))
      break;

  fromUser = stdIn.readLine();

  if (fromUser != null){
      System.out.println("Client: " + fromUser);
      out.println(fromUser);
  }

server 上,我们有相应的代码,来获取笑话的妙语。

    KnockKnockProtocol kkp = new KnockKnockProtocol();

    outputLine = kkp.processInput(null);
    out.println(outputLine);

    while ((inputLine = in.readLine()) != null) {
         outputLine = kkp.processInput(inputLine);
         out.println(outputLine);
         if (outputLine.equals("Bye."))
            break;

我想在整个事情上附加一个心跳,当它检测到对方死亡时,它将打印到控制台。因为如果我杀死对方现在会发生什么是一个异常(exception) - 如下所示:

enter image description here

因此,如果我同时运行 KnockKnockClient 和 KnockKnockServer,然后我关闭了 KnockKnockServer,应该会发生什么是在客户端上我看到这样的输出:

>The system has detected that KnockKnockServer was aborted

我正在寻找任何提示。到目前为止,我主要是在尝试运行一个定期创建与另一端的新连接的守护线程。但我对检查什么条件感到困惑(但我认为这只是一个 boolean 值?)。这是正确的方法吗?我刚在网上发现有一个图书馆叫JGroups for multicast网络 - 那会是更好的方式吗?我正在寻找任何提示。

My server-code so far (抱歉,有点乱)

&

Client-side

谢谢

最佳答案

但是你得到的异常(exception)就是这个!它告诉你,对方刚刚死了。只需捕获异常并打印到控制台,即“系统检测到 KnockKnockServer 已中止”。

您正在使用 TCP 连接,并且 TCP 具有内置的心跳(keepalive)机制,可以为您执行此操作。只需在套接字上设置 setKeepAlive() 即可。话虽如此 - 可以控制每个连接的保活频率,但我不知道如何在 java 中做到这一点。

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

https://stackoverflow.com/a/1480259/706650

关于java - 如何在此 Java 代码之上添加心跳消息(用于 KnockKnockClient/Server)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604015/

相关文章:

Python线程给出全局名称未定义错误

javascript - socket.on 断开连接不起作用

c++ - 确定未绑定(bind)套接字的地址族

ios - 如何获取网络更改通知(连接、断开连接、更改)

java - 避免流问题的编码指南

java - 从简单的 java 客户端调用 Web 服务

java - Spring启动事务时的通知?

Java 电子邮件 UTF 验证

c - ipv6组播接收

node.js - 如何断开与本地主机的连接?