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 _); }
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(); } }