我正在开发一个使用套接字的程序,我想每秒向我的客户端发送一次心跳,以检查它们是否仍处于连接状态。
我如何有效地做到这一点?
while (true) { // send heartbeats to client
try {
socketOut.write(0);
} catch (Exception e) {
System.out.println("client disconnected");
break;
}
}
那是我当前的代码,但是 while 循环弄乱了我所有其他的客户端。这使他们无法连接到游戏(服务器套接字)。如何在不影响游戏和其他客户端的情况下完成心跳?
注意:我一直在讨论使用计时器来实现我的 1 秒延迟,但我不知道它是否有效,也不知道它对于同时连接许多客户端的大型游戏是否有效.
最佳答案
您确定服务器需要轮询客户端的心跳信号而不是让客户端向服务器发送心跳信号吗?
一般来说,服务器会连接到套接字,等待接受客户端连接,然后在单独的线程上处理客户端请求。
我认为您只需让客户端生成一个心跳线程,该线程在心跳期间 hibernate ,然后唤醒并向服务器发送心跳 ping,就可以实现您的目标。只要客户端存在,客户端上的心跳线程就会存在,它只会循环。无论哪种方式,您的服务器都需要跟踪所有客户端,以便能够轮询它们的心跳,或者使用这种方法,只需跟踪哪些客户端正在主动发送心跳。
关于Java 套接字心跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820912/