内容发布更新时间 : 2024/12/23 0:13:51星期一 下面是文章的全部内容请认真阅读。
服务器基于BIO建立Socket服务
1 多线程阻塞等待,建立Socket服务.
基于BIO IO模型建立多线程阻塞等待客户端的连接操作。等待的连接线程独立;
连接成功:建立新的线程,处理发送和接收消息等操作;
连接失败:报io异常,连接线程不中断,继续等待新的客户端连接; 无连接:线程阻塞等待;
2 生产消费者模式,等待接收来自客户端Socket消息
一个socket通讯建立起来之后,开启新的线程处理发送,接收消息,在这个新的线程里面,建立一个并发的队列,服务器生产数据,客户端消费数据,没有数据发送的时候,线程队列保持阻塞等待状态。
3 支持心跳机制,让客户端保持长连接不断线
服务器设置了读超时机制,客户端如果在指定的时间内没有向服务器发送数据进行通讯,服务器认定客户端是离线状态,主动断开等待线程,结束对某一个客户端的socket通讯
心跳检测步骤:
1 客户端每隔一个时间间隔发生一个探测包给服务器 2 客户端发包时启动一个超时定时器
3服务器端接收到检测包,应该回应一个包
3 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器 4 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了
很多人会用booleansocketFlag = socket.isConnected() && socket.isClosed()来判断就行了,但事实上这些方法都是访问socket在内存驻留的状态,当socket和服务器端建立链接后,即使socket链接断掉了,调用上面的方法返回的仍然是链接时的状态,而不是socket的实时链接状态,所以这样心跳用这个不靠谱
4 Socket服务载入Spring Bean容器中,结合业务组件进行业务操作
通过注解的方式@Componment的方式把socket接口回调类注入spring 容器中,这样就可以很方面的在spring 控制器中处理关于socket服务的各项回调接口,完成相关业务操作