1

我正在为 Grasshopper for Rhino 开发一个插件,它使用带有 C# 的 .NET 框架,但在重新连接到 socket.io 1.4.5 服务器时出现问题。我正在使用SocketIoClientDotNet 0.9.13连接到服务器,如果我只想连接/断开与服务器的连接,它可以正常工作,但是在我收到使用事件的消息后重新连接到服务器时遇到问题需要很多时间重新连接。

取决于我在连接期间通过事件收到的消息数量,在我关闭并建立新连接后,新连接需要超过一分钟(如果收到很多消息,有时会超过 10 分钟)。

有人能告诉我出了什么问题吗?

代码编写如下:

Quobject.SocketIoClientDotNet.Client.Socket socket;

private System.Threading.ManualResetEvent manualResetEvent = null;
private bool currentState = false;
public object output = null;
public bool connected = false;

private Quobject.SocketIoClientDotNet.Client.IO.Options CreateOptions()
{
  Quobject.SocketIoClientDotNet.Client.IO.Options op = new Quobject.SocketIoClientDotNet.Client.IO.Options();
  op.AutoConnect = true;
  op.Reconnection = true;
  op.ReconnectionAttempts = 5;
  op.ReconnectionDelay = 5;
  op.Timeout = 20;
  op.Secure = true;
  op.ForceNew = true;
  op.Multiplex = true;
  return op;
}

private void ConnectToSocket(bool b, string address){
  if(currentState != b){
    if(b && !connected){
        manualResetEvent = new System.Threading.ManualResetEvent(false);

        var options = CreateOptions();
        socket = IO.Socket(address, options);

        socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_CONNECT, () =>
          {

          connected = true;
          Print("connected");
          manualResetEvent.Set();
          });

        socket.On("slider_message", (data) =>
          {
          if(data != null){
            var jobject = data as JToken;
            try{
              var sliderValue = jobject.Value<string>("slider");
              output = sliderValue;
            }catch{

            }
          }

          manualResetEvent.Set();
          });
     
        socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_DISCONNECT, () =>
          {

          connected = false;
          Print("disconnected");

          manualResetEvent.Set();
          });

        Print("connecting...");

        manualResetEvent.WaitOne();
    }else{
      if(socket != null & connected){
        manualResetEvent = new System.Threading.ManualResetEvent(false);

        Print("disconnecting...");
        socket.Close();

        manualResetEvent.WaitOne();
        socket = null;
      }
    }
  }

  currentState = b;
}
4

0 回答 0