经过多次网上资料的查询和同事的探讨;解决了一个很常见很基础的问题,再次记录下;希望能帮助到新人;
问题:
同步阻塞方式Socket下,接受数据发生了异常,如何处理:
异常:关闭发送客户端;
解决:这类问题只需要一个try catch就可以解决;
异常:拔网线、停电等;
解决:
首先分析下原因,当网络断开时,接收端并不知道,因为此时此刻的接收数据为0,与发送端不发送是类似的,线程会进入无限等待的情况;
此时根据业务逻辑有不同的处理方式:
1、如果是短连接、或者类似手动触发的业务请求可以采用:(由于项目需求,我使用的这个方法解决的。。。)
设置接收超时机制来应对:
2、如果是长连接,上述解决方案会由于长时间不发送信息等状态混淆而错误处理,因此需要使用非阻塞式Socket进行接收数据,因此可以立即返回接收状态,
当收到10035(无法立即完成一个非阻止性套接字操作)的异常时,判断下当前是否还在连接中,如果仍处于连接状态中即可继续接收;否则建立重连机制;
3、与上述方式类似,建立心跳机制,每隔几秒确认网络是否畅通。
注: Socket 的 Receive 方法本身就是阻塞式的,当没有数据可接收的时候就会一直等待,除非你设置了timeout属性。
如果是 异步非阻塞的方式,则利用递归的方式调用BeginReceive 即可。
问题:
在现场测试时,发现网络可以ping通,但是Socket无法连接,如何排查:
情况1:首先请检查服务器端的IP端口是否被成功监听,我遇到的情况是服务器包含了多个IP地址,导致连接不成功;
解决办法:监听IP设置为0.0.0.0,以便监听服务器端所有的IP;
情况2:检查端口是否被防火墙或杀毒软件阻止。
解决办法:白名单伺候,或者添加出入站规则;
(有不正确的地方,期望大神们的指正)