我正在研究以下基本 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) - 如下所示:
因此,如果我同时运行 KnockKnockClient 和 KnockKnockServer,然后我关闭了 KnockKnockServer,应该会发生什么是在客户端上我看到这样的输出:
>The system has detected that KnockKnockServer was aborted
我正在寻找任何提示。到目前为止,我主要是在尝试运行一个定期创建与另一端的新连接的守护线程。但我对检查什么条件感到困惑(但我认为这只是一个 boolean
值?)。这是正确的方法吗?我刚在网上发现有一个图书馆叫JGroups for multicast网络 - 那会是更好的方式吗?我正在寻找任何提示。
My server-code so far (抱歉,有点乱)
&
谢谢
最佳答案
但是你得到的异常(exception)就是这个!它告诉你,对方刚刚死了。只需捕获异常并打印到控制台,即“系统检测到 KnockKnockServer 已中止”。
您正在使用 TCP 连接,并且 TCP 具有内置的心跳(keepalive)机制,可以为您执行此操作。只需在套接字上设置 setKeepAlive() 即可。话虽如此 - 可以控制每个连接的保活频率,但我不知道如何在 java 中做到这一点。
关于java - 如何在此 Java 代码之上添加心跳消息(用于 KnockKnockClient/Server)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604015/