websocket-sharp сервер, отправляющий дубликаты сообщений
Здесь есть шум.
Я создаю сетевое приложение, используя websocket-sharp, и столкнулся с проблемой, когда сервер отправляет сотни (не всегда одинаковое количество) дубликатов сообщений клиенту, вот и разбивка.
1.) Клиент подключается (это рукопожатие работает нормально).
2.) При подключении клиента сервер отправляет указанному клиенту идентификатор сеанса, созданный для этого подключения. (Это работает)
3.) Клиент получает и сохраняет идентификатор сеанса. (Это работает и дубликаты здесь не отправляются)
4.) Клиент отправляет запрос в систему лобби на сервере, чтобы создать совпадение. (Это работает и получено правильно)
5.) Сервер получает запросы на создание совпадения, создает совпадение и отправляет данные сопоставления обратно клиенту (фактически отправлено одно сообщение, но клиент получает сотни одинаковых сообщений (все сообщения имеют одинаковый размер и содержат одинаковую информацию).)).
Я проверил логику своей системы лобби, и нет цикла, который мог бы посылать ответ о создании совпадения несколько раз, кроме того, я знаю, что метод "Отправить" на сервере вызывается только один раз.
Я просмотрел документацию, в которой есть тонкость веб-сокета, и подумал, что, может быть, каким-то образом сотни сеансов выполняются из одного соединения или что-то бессмысленное по этим линиям, но я подключаю одного клиента, и выходит только один сеанс:/
Дайте мне знать, если у вас есть идеи, как это могло произойти. Заранее спасибо.
Смотрите код ниже.
Сервер:
Метод отправки:
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;
}
}
1 ответ
На стороне клиента, вы должны убедиться, что вы вызываете следующую строку только один раз
GetPersistent ().OnMessage += MessageHandler;
В противном случае вы бы регистрировали один и тот же обработчик несколько раз для получения сообщения.
Примечание. Такое поведение может потребоваться, если вы хотите присоединить несколько обработчиков к одному и тому же событию OnMessage.