若是本身去实现心跳功能其实最土的办法是隔必定时间向服务端发送一个心跳包,而后服务端若是收到了,服务端就发送一个响应信号,若是客户端在必定的时间间隔内取得了这个响应,那么链接是正常的,若是没有取得,那么重连这个socket.
我想若是JDK已经实现了这个功能的话,那我就不必本身再去造轮子了。
参考了一下网上的资料,说是socket.setKeepAlive(true)就实现了心跳包的发送功能,我不知道这个API每隔多少时间去发送一次,仍是这种用法有些误解,我假定这种用法是对的,那么,心跳时间间隔我本身实现:
在Client中
心跳线程中的
java
Socket socket = Socket( " 127.0.0.1 " , 8080 ); socket.setKeepAlive( true );
run里以下实现,每隔60秒触发一下, socket
public void run{ while ( true ){ if (socket.getKeepAlive){ System.out.println( " Client connect to Server is OK " ); } else { socket = soket( " 127.0.0.1 " , 8080 ); } try { Thread.sleep( 60000 ); } catch (InterruptedException e) { e.printStackTrace(); } } }为 TCP 套接字设置 keepalive 选项时,若是在 2 个小时(注:实际值与实现有关)内在任意方向上都没有跨越套接字交换数据,则 TCP 会自动将 keepalive 探头发送到同位体。此探头是同位体必须响应的 TCP 段。 指望的响应为如下三种之一: 1. 同位体经过指望的 ACK 响应。不通知应用程序(由于一切正常)。在另外一个 2 小时的不活动时间事后,TCP 将发送另外一个探头。 2. 同位体经过 RST 响应,通知本地 TCP 同位体主机已崩溃并从新启动。套接字被关闭。 3. 同位体没有响应。套接字被关闭。 此选项的目的是检测同位体主机是否崩溃。 仅对 TCP 套接字(SocketImpl)有效。 更多说明参见 java.net.SocketOptions 接口。