Java Socket Heartbeats

时间:2013-12-29 00:32:37

标签: java sockets

我正在开发一个使用套接字的程序,我想每秒向我的客户发送一个心跳,以检查它们是否仍然连接。

我该如何有效地做到这一点?

                    while (true) { // send heartbeats to client
                    try {
                        socketOut.write(0);
                    } catch (Exception e) {
                        System.out.println("client disconnected");
                        break;
                    }
                }

这是我当前的代码,但是while循环会扰乱我所有其他客户端。这使他们无法连接到游戏(服务器套接字)。如何在不影响游戏和其他客户的情况下完成心跳?

注意:我一直在争论使用计时器来实现我的1秒延迟,但我不知道它是否会起作用,也不知道它对于同时连接多个客户端的大型游戏是否有效

2 个答案:

答案 0 :(得分:2)

您确定服务器需要轮询客户端以获取心跳而不是让客户端向服务器发送心跳吗?

一般来说,服务器将连接到套接字,等待接受客户端连接,然后在单独的线程上处理客户端请求。

我认为您只需让客户端生成一个在心跳持续时间内休眠的心跳线程,然后唤醒以向服务器发送心跳ping,就能完成目标。客户端上的心跳线程只要客户端就可以运行,它只会循环。无论哪种方式,您的服务器都需要跟踪所有客户端,以便能够轮询他们的心跳,或者使用这种方法,只需跟踪哪些客户端正在主动发送心跳。

答案 1 :(得分:2)

尝试java.util。Timer

Timer t = new Timer();
t.schedule(new TimerTask(){
   @Override
   public void run(){/*...Your task...*/}
}, 1000);