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.

Другие вопросы по тегам