Java nio服务器端对于客户端连接状态的判断
本文将介绍一个基于Java NIO开发的TCP通讯服务器端实现,用于实时监控客户端的连接状态。因为本人第一次用Java写服务器端,甚至是第一次写服务器端程序,因此过程并不是十分顺利,也是一步一个坑在走。之前遇到一个非常棘手的问题,即如果客户端因为断电或异常终止程序时,并不会像服务器发送一个读end-stream的标记,这时,我通过在服务器端给每个客户端连接加心跳监控的方式,主动检查连接状态,当心跳超时未收到客户端回应时,即调用相应客户端的SocketChannel.Close()方法。但是当同一个客户端再次请求建立连接时,会导致服务器通讯线程崩溃。
下面先介绍如何实现主动监听客户端连接状态,再注明解决上述问题的办法。
因本人算是服务器端的初学者,这套方法经测试确实可用,如有不妥之处还望轻喷~也希望能看到各位更完美的解决方案。
如果客户端异常关闭,关闭前没有主动断开TCP连接,这样服务器端无法被动获知客户端的状态。因此通过不断给客户端发送心跳包的方式来主动检测连接情况。
- 以下为监控线程的代码实现:
/**
* TCP连接监控线程
* @author Quintus
*
*/
public class SocketMonitor implements Runnable
{
/**
* 通讯线程发送消息方法
*/
private ISend sendFunc;
/**
* 通讯线程的关闭连接方法
*/
private IShutDown shutDownFunc;
public SocketMonitor(ISend _sendFunc, IShutDown _shutDownFunc)
{
sendFunc = _sendFunc;
shutDownFunc = _shutDownFunc;