socket.io-client-csharp
socket.io-client-csharp copied to clipboard
网络断开重连会Crash
关于SocketClient
SocketIO.ConnectAsync 关于这方法.如图所示位置的throw.

问题Crash: 复现步骤:
- PC连接手机热点. 手机打开流量
- PC 运行SocketClient Demo
- Socket 连接成功
- 手机关闭流量
- Socket 会自动重连.
SocketIO.InvokeDisconnect: await ConnectAsync().ConfigureAwait(false); - 等待超时
- 在如图所示位置会产生异常
- 程序Crash
因为异常类型为task cancel. 不在_expectedExceptions 中
{ typeof(TimeoutException), typeof(WebSocketException), typeof(HttpRequestException), typeof(OperationCanceledException) };
解决方案:
- 对于这种网络类型的错误也应该进行重连(尝试去捕获这种异常).
- 对于其他类型的错误不应该在这里抛出异常.而是触发连接失败事件. 或者说只有首次连接抛出异常. 如果是断开重连失败的话程序会Crash. 可能是线程中出现的异常(我没有具体看代码)
重新连接时,可能会有多种异常,_expectedExceptions 中仅仅预定义了几种。
有的用户在 unity 或者 xamarin 上使用它,这时连接失败会抛出其它异常,这些异常在更高层的程序集上,所以此库不可能包含所有的异常。
例如,在 xamarin Android 上,抛出的异常可能是 Java.Net.SocketException,这个异常类型可能定义在 Xamarin for Android(我不确定具体在哪里),库不会知道具体平台的异常,这时需要用户自己去添加 ExpectedExceptions
如何你确定某个异常,应该重新连接,你应该把异常添加到 _expectedExceptions 中:
var io = new SocketIO(...);
io.AddExpectedException(typeof(YourException));
感谢你的回复.
我期望的是不会产生异常而是以事件的形式通知给我. 例如XXXErrorEvent. 异常可能会导致整个程序的崩溃. 而且对于线程中的异常还无法捕获. 不可预料的异常让程序崩溃并且不能全局捕获到. 这会对我们的项目影响有些大.
我会修改代码使其以事件的形式返回错误而不是异常.
目前我在做性能测试.