应用场景:
1.Linux操作系统 ,Almalinux,与redhat8相同
2.supersocket2.0.0-beta.28,websokcet server服务
3.连接超时需要断开连接,触发断开事件,做掉线业务处理。
问题:
1.通过看2.0源码发现是通过LastActiveTime来判断连接是否活跃的,但这里客户端发送消息与服务器发送消息都会重写该时间,所以当网络不好时(如关闭网络时),这时虽然客户端无法发送消息,但服务器不知道该连接断开,还是会不停给该连接发送消息(业务需要),这里LastActiveTime都是会不停刷新最新时间,没法断开。
2.自己写了一个超时业务判断 (心跳处理),只判断接收客户端发送消息的时间,也就是服务端接收到该连接发送的消息时间,如果大于超时限制时间时就手动断开连接,session.Connection.CloseAsync(CloseReason.TimeOut);,与ss2.0底层使用相同方法,这时虽然调用,但无法真正关闭,没触发OnSessionClosedAsync。其实这时服务端还是不停向该连接发送消息,不知是不是这里有判断 该连接pipe有消息,所以不会断开?
3.windows 平台不会出现该情况,在网络关闭后30s时间,服务端发送消息时会抛出异常,触发断开事件。
4.almalinux中,在网络关闭后15m的样子,也是发送消息会抛出异常,触发断开事件。
结果 :
1.希望close连接时,能立即触发断开事件,方便业务处理。根据自己超时判断业务,
2.能优化ss2.0底层库超时处理就更好
应用场景:
1.Linux操作系统 ,Almalinux,与redhat8相同
2.supersocket2.0.0-beta.28,websokcet server服务
3.连接超时需要断开连接,触发断开事件,做掉线业务处理。
问题:
1.通过看2.0源码发现是通过LastActiveTime来判断连接是否活跃的,但这里客户端发送消息与服务器发送消息都会重写该时间,所以当网络不好时(如关闭网络时),这时虽然客户端无法发送消息,但服务器不知道该连接断开,还是会不停给该连接发送消息(业务需要),这里LastActiveTime都是会不停刷新最新时间,没法断开。
2.自己写了一个超时业务判断 (心跳处理),只判断接收客户端发送消息的时间,也就是服务端接收到该连接发送的消息时间,如果大于超时限制时间时就手动断开连接,session.Connection.CloseAsync(CloseReason.TimeOut);,与ss2.0底层使用相同方法,这时虽然调用,但无法真正关闭,没触发OnSessionClosedAsync。其实这时服务端还是不停向该连接发送消息,不知是不是这里有判断 该连接pipe有消息,所以不会断开?
3.windows 平台不会出现该情况,在网络关闭后30s时间,服务端发送消息时会抛出异常,触发断开事件。
4.almalinux中,在网络关闭后15m的样子,也是发送消息会抛出异常,触发断开事件。
结果 :
1.希望close连接时,能立即触发断开事件,方便业务处理。根据自己超时判断业务,
2.能优化ss2.0底层库超时处理就更好