Ejemplo n.º 1
0
        private void ProcessLogOn(object sender, LogOnEventArgs e)
        {
            var id = e.UserId;

            AddRecord(id, new UserRecord(e.Client, id));
            MessageHandler.SendMessage(QueryRecord(e.UserId).Client,
                                       new ServerProtocol.PacketHeader(ServerProtocol.MessageKind.Info, ErrorKind.Ok, e.SequenceNumber),
                                       new InfoPacket(new UserInfo {
                UserID = e.UserId
            }, GetOnlineUsers()));
            _rwLock.EnterReadLock();
            foreach (var user in _userRecords)
            {
                var record = user.Value;
                if (user.Key != e.UserId)
                {
                    Console.WriteLine($"Told {user.Key}  {e.UserId} online!");
                    MessageHandler.SendMessage(record.Client, new ServerProtocol.PacketHeader(ServerProtocol.MessageKind.NewBodyOnline, ErrorKind.Ok, 0),
                                               new NewBodyOnlinePacket(e.UserId, new UserInfo {
                        UserID = e.UserId
                    }));
                }
            }
            _rwLock.ExitReadLock();
        }
Ejemplo n.º 2
0
        private void ProcessGotChat(object sender, ChatEventArgs e)
        {
            var client = GetClient(e.DestinationUserId);

            if (client != null)
            {
                MessageHandler.SendMessage(client, new ServerProtocol.PacketHeader
                                           (
                                               ServerProtocol.MessageKind.Chat,
                                               ErrorKind.Ok,
                                               e.SequenceNumber
                                           ),
                                           new ServerProtocol.ChatPacket
                                           (
                                               e.UserId,
                                               e.ChatContent
                                           ));
            }
        }
Ejemplo n.º 3
0
        private void ProcessClientMessage(string headerJson, string bodyJson, TcpClient client)
        {
            var header = JsonConvert.DeserializeObject <ClientProtocol.PacketHeader>(headerJson);
            var id     = header.UserId;

            switch (header.Kind)
            {
            case ClientProtocol.MessageKind.LogOn:
            {
                if (HasUser(id))
                {
                    //TODO: 发送 null。
                    MessageHandler.SendMessage(client, new ServerProtocol.PacketHeader(ServerProtocol.MessageKind.Info, ErrorKind.DuplicateId, header.SequenceNumber), null);
                    return;
                }
                OnGotLogOn?.Invoke(this, new LogOnEventArgs(header, JsonConvert.DeserializeObject <LogOnPacket>(bodyJson), client));
            }
            break;

            case ClientProtocol.MessageKind.LogOut:
                if (Validate(client, id))
                {
                    OnGotLogOut?.Invoke(this, new LogOutEventArgs(header, JsonConvert.DeserializeObject <LogOutPacket>(bodyJson)));
                }
                break;

            case ClientProtocol.MessageKind.Chat:
                var body = JsonConvert.DeserializeObject <ClientProtocol.ChatPacket>(bodyJson);
                OnGotChat?.Invoke(this, new ChatEventArgs(header, body));
                break;

            case ClientProtocol.MessageKind.HeartBeat:
                if (Validate(client, id))
                {
                    OnGotHeartBeat?.Invoke(this, new HeartBeatEventArgs(header, JsonConvert.DeserializeObject <HeartBeatPacket>(bodyJson)));
                }
                break;

            default:
                throw new InvalidOperationException();
            }
        }