【问题标题】:websocket-sharp server sending duplicate messageswebsocket-sharp 服务器发送重复消息
【发布时间】:2017-03-30 19:04:31
【问题描述】:

这里是闹剧。

我正在使用 websocket-sharp 构建一个联网的应用程序,我遇到了一个问题,即服务器向客户端发送数百条(不一致的数量)重复消息,这是故障。

1.) 客户端连接(此握手工作正常)。

2.) 在客户端连接时,服务器向所述客户端发送为该连接创建的会话 ID。 (这行得通)

3.) 客户端接收并存储会话 ID。 (这行得通,这里没有重复发送)

4.) 客户端向服务器上的大厅系统发送请求以创建匹配。 (这有效并且被正确接收)

5.) 服务器收到匹配创建请求,创建匹配并将匹配数据发送回客户端(实际上发送了一条消息,但客户端接收到数百条相同的消息(所有消息大小相同,包含相同的信息))。

我检查了我的大厅系统逻辑,没有循环多次发送匹配创建回复,而且我知道服务器上的“发送”方法只被调用一次。

我查看了 websocket-sharp 文档,我想可能不知何故,有数百个会话是从一个连接进行的,或者沿着这些线路进行一些无意义的,但我正在连接一个客户端并且只有一个会话退出:/

如果您对如何发生这种情况有任何想法,请告诉我。提前致谢。

代码见下文。

服务器:

发送方法:

public void Send (string path, string targetID, string script, string method, params object[] data) {
    print ("SERVER: Sending Message");
    WebSocketServiceHost host = null;
    GetSocketServer ().WebSocketServices.TryGetServiceHost (path, out host);
    if (host != null) {
        Network.Packet packet = new Network.Packet ("Server", targetID, script, method, data);
        if (targetID != "Broadcast") {
            GetSocketServer ().WebSocketServices.Broadcast (Formatter.singleton.Serialize (packet));
        } else if (targetID == "Service") {
            host.Sessions.Broadcast (Formatter.singleton.Serialize (packet));
        } else {
            host.Sessions.SendToAsync (Formatter.singleton.Serialize (packet), targetID);
        }
    }
}

客户:

接收方法:

GetPersistent ().OnMessage += MessageHandler;

void MessageHandler (object sender, MessageEventArgs e) {
    Debug.Log ("CLIENT: Message Recieved");
    Network.singleton.Recieve (e.RawData);
}

网络:(供服务器和客户端使用)

接收方法:

public void Recieve (byte[] data) {
    object obj = Formatter.singleton.Deserialize (data);
    messages.Add (messages.Count, obj);
}

IEnumerator ProcessorCoro () {
    WaitForSeconds delay = new WaitForSeconds (Time.deltaTime);
    while (true) {
        if (messages.Count >= 1) {
            Process (messages [(messages.Count - 1)]);
            messages.Remove ((messages.Count - 1));
        } 
        yield return delay;
    }
}

public void Process (object data) {
    Network.Packet packet = (Network.Packet)data;
    switch (packet.script) {
    case "Home":
        Home.singleton.SendMessage (packet.method, data, SendMessageOptions.DontRequireReceiver);
        break;
    case "Arena":
        Arena.singleton.SendMessage (packet.method, data, SendMessageOptions.DontRequireReceiver);
        break;
    case "Client":
        Client.singleton.SendMessage (packet.method, data, SendMessageOptions.DontRequireReceiver);
        break;
    case "Database":
        Database.singleton.SendMessage (packet.method, data, SendMessageOptions.DontRequireReceiver);
        break;
    }
}

【问题讨论】:

  • 通过说`接收数百个相同的消息`,你的意思是 MessageHandler() 被调用了数百次,因此 Process() 被调用了数百次,或者只是 Process() 被调用了数百次?
  • MessageHandler 被调用。它将 debug.log 打印到控制台。
  • 我对你代码中的GetPersistent() 感到很困惑。我在 Unity 的库和 websocket-sharp 的源代码中都没有找到这个函数。这是您编写的用于与服务器上的 web-socket 建立连接的函数吗?
  • @Chong 是的,您可以为每个客户端建立多个连接,在我的情况下,我有一个临时和持久的连接。该调用只是将事件委托给该连接。那部分正在工作,如果不是这样,我根本不会处理 com。

标签: c# networking unity3d websocket-sharp


【解决方案1】:

在客户端,您需要确保只调用以下行一次

GetPersistent ().OnMessage += MessageHandler;

否则,您将在消息接收中多次注册同一个处理程序。


注意:如果您想将多个处理程序附加到同一个 OnMessage 事件,则可能需要此行为。

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多