C# websocket sharp服务器发送重复消息

C# websocket sharp服务器发送重复消息,c#,networking,unity3d,websocket-sharp,C#,Networking,Unity3d,Websocket Sharp,这是朗普 我正在使用websocket sharp构建一个网络应用程序,我遇到了一个问题,服务器向客户端发送数百条(数量不一致)重复消息,下面是详细信息 1.)客户端连接(此握手工作正常) 2.)在客户端连接时,服务器向所述客户端发送为该连接创建的会话ID。(本工程) 3.)客户端接收并存储会话ID。(此操作有效,此处不发送副本) 4.)客户端向服务器上的大厅系统发送请求以创建匹配。(此功能正常工作并正确接收) 5.)服务器接收匹配创建请求,创建匹配并将匹配数据发送回客户端(实际上发送了一条消息

这是朗普

我正在使用websocket sharp构建一个网络应用程序,我遇到了一个问题,服务器向客户端发送数百条(数量不一致)重复消息,下面是详细信息

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

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

3.)客户端接收并存储会话ID。(此操作有效,此处不发送副本)

4.)客户端向服务器上的大厅系统发送请求以创建匹配。(此功能正常工作并正确接收)

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

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

我浏览了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;
    }
}

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

GetPersistent ().OnMessage += MessageHandler;
否则,您将多次向消息接收注册同一处理程序



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

说“接收数百条相同的消息”,是指MessageHandler()被调用数百次,因此Process()被调用数百次,还是仅Process()被调用数百次?MessageHandler被调用。它将debug.log打印到控制台。我对代码中的
GetPersistent()
感到非常困惑。我在Unity的库和websocket sharp的源代码中都没有找到这个函数。这是您编写的用于在服务器上与web套接字建立连接的函数吗?@Chong是的,您可以为每个客户端建立多个连接,在我的示例中,我有一个临时和持久连接。那个调用只是将一个事件委托给那个连接。这部分工作正常,如果不是的话,我根本不会处理com。