doghappy / socket.io-client-csharp

socket.io-client implemention for .NET
MIT License
721 stars 124 forks source link

网络断开重连会Crash #272

Open e8-ChenKaipeng opened 2 years ago

e8-ChenKaipeng commented 2 years ago

关于SocketClient SocketIO.ConnectAsync 关于这方法.如图所示位置的throw. 20220311150353

问题Crash: 复现步骤:

  1. PC连接手机热点. 手机打开流量
  2. PC 运行SocketClient Demo
  3. Socket 连接成功
  4. 手机关闭流量
  5. Socket 会自动重连. SocketIO.InvokeDisconnect: await ConnectAsync().ConfigureAwait(false);
  6. 等待超时
  7. 在如图所示位置会产生异常
  8. 程序Crash

因为异常类型为task cancel. 不在_expectedExceptions 中 { typeof(TimeoutException), typeof(WebSocketException), typeof(HttpRequestException), typeof(OperationCanceledException) };

解决方案:

  1. 对于这种网络类型的错误也应该进行重连(尝试去捕获这种异常).
  2. 对于其他类型的错误不应该在这里抛出异常.而是触发连接失败事件. 或者说只有首次连接抛出异常. 如果是断开重连失败的话程序会Crash. 可能是线程中出现的异常(我没有具体看代码)
doghappy commented 2 years ago

重新连接时,可能会有多种异常,_expectedExceptions 中仅仅预定义了几种。

有的用户在 unity 或者 xamarin 上使用它,这时连接失败会抛出其它异常,这些异常在更高层的程序集上,所以此库不可能包含所有的异常。

例如,在 xamarin Android 上,抛出的异常可能是 Java.Net.SocketException,这个异常类型可能定义在 Xamarin for Android(我不确定具体在哪里),库不会知道具体平台的异常,这时需要用户自己去添加 ExpectedExceptions

如何你确定某个异常,应该重新连接,你应该把异常添加到 _expectedExceptions 中:

var io = new SocketIO(...);
io.AddExpectedException(typeof(YourException));
e8-ChenKaipeng commented 2 years ago

感谢你的回复.

我期望的是不会产生异常而是以事件的形式通知给我. 例如XXXErrorEvent. 异常可能会导致整个程序的崩溃. 而且对于线程中的异常还无法捕获. 不可预料的异常让程序崩溃并且不能全局捕获到. 这会对我们的项目影响有些大.

我会修改代码使其以事件的形式返回错误而不是异常.


目前我在做性能测试.