private void ClientMessageReceivedHandler(RemoteClient client, byte[] payload, int payloadSize)
 {
     _clients.TryGetValue(client, out var _reliableEndpoint);
     _reliableEndpoint.ReceivePacket(payload, payloadSize);
 }
 public void Send(RemoteClient client, byte[] payload, int payloadSize, QosType type = QosType.Unreliable)
 {
     _clients.TryGetValue(client, out var reliableEndpoint);
     reliableEndpoint?.SendMessage(payload, payloadSize, type);
 }
 private void ClientDisconnectedHandler(RemoteClient client)
 {
     Console.WriteLine($"clientDisconnectedHandler: {client}");
     _clients.TryRemove(client, out _);
 }
Beispiel #4
0
        private void HandleSession(RemoteClient client)
        {
            IntermittentSession session = null;
            string body;

            Console.WriteLine($"({client.ID}): new client connected");
            RemoteSession.MsgType loginMsg = RemoteSession.MsgType.Null;
            try { loginMsg = (RemoteSession.MsgType)client.ReadMessage(out body); }
            catch (System.IO.IOException)
            {
                Console.WriteLine($"({client.ID}): login message hasn't arrived, disconnecting");
                client.Close();
                return;
            }

            // TODO: Проверка на уникальность сессии при вводе логина-пароля? (если сессии такого пользователя уже есть, то закрываем их)
            // TODO: Для новых пользователей отправляем уникальное сообщение об успешном входе, чтобы клиент мог отобразить справку (и т.п.)
            if (loginMsg == ReaGame.RemoteSession.MsgType.Login)
            {
                session = new IntermittentSession(client);
                if (!session.Authenticate(body))
                {
                    Console.WriteLine("[{0}]: authentication failed, disconnected.", session.ID);
                    try { session.SendMessage(RemoteSession.MsgType.No, "Invalid login or password."); } catch (System.IO.IOException) { }
                    session.Close("Аутентификация не пройдена");
                    return;
                }
                else
                {
                    session.SendMessage(RemoteSession.MsgType.Login, session.ID.ToString());
                    foreach (var ses in activeSessions)
                    {
                        if ((ses.UserID == session.UserID) && (ses.Active))
                        {
                            ses.Close($"Пользователь [{session.UserID}] подключился к другой сессии [{session.ID}]");
                        }
                    }
                    Console.WriteLine("[{0}]: authentication completed.", session.ID);
                    session.Paused = false;
                    activeSessions.Add(session);
                }
                // Check other sessions for this user id
            }
            else if (loginMsg == ReaGame.RemoteSession.MsgType.RestoreSession)
            {
                // TODO: Check for session state, base returned message on it
                session = activeSessions.FirstOrDefault(x => x.ID == new Guid(body) && x.Active);
                if ((session == null))
                {
                    Console.WriteLine($"({client.ID}): reconnection failed (using bad id [{body}]), disconnected.");
                    client.SendMessage((byte)RemoteSession.MsgType.No, "Session token invalid or obsolete.");
                    client.Dispose();
                    return;
                }
                else
                {
                    session.Reconnect(client);
                    Console.WriteLine($"({client.ID}) Reconnected to session [{session.ID}]");
                    session.SendMessage(RemoteSession.MsgType.RestoreSession);
                    session.Paused = false;
                }
            }
            while (!session.Paused)
            {
                session.GetMessages();
            }
        }