这是喧嚣。
我正在使用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;
}
}
答案 0 :(得分:0)
在客户端,您需要确保只拨打以下行
GetPersistent ().OnMessage += MessageHandler;
否则,您将多次向消息接收注册同一处理程序。
注意:如果要将多个处理程序附加到同一OnMessage事件,则可能需要此行为。