Exemplo n.º 1
0
        public void WelcomeHandler(WelcomePacket wp, NetPeer peer)
        {
            if (wp != null)
            {
                Console.WriteLine($"We got: {wp.PlayerId+1} from {peer.EndPoint.ToString()}");
                _loggingFunc?.Invoke(wp.PlayerId + 1);
                selfId = wp.PlayerId;


                //get player handle
                var player = _playerHandler?.Invoke();
                player.PlayerId = wp.PlayerNumber;
                player.Location = new Point(wp.XStart, wp.YStart);
                Console.WriteLine($"Player moved to new start location:{wp.XStart},{wp.YStart}");
            }
            else
            {
                Console.WriteLine("Packet was malformed!");
            }
        }
Exemplo n.º 2
0
        public Client(TcpClient socket)
        {
            this.socket       = socket;
            stream            = socket.GetStream();
            serializer        = new BinaryFormatter();
            serializer.Binder = new CustomBinder();

            threadIn  = new Thread(new ThreadStart(listen));
            threadOut = new Thread(new ThreadStart(send));

            _packetsToSend = new BlockingConcurrentQueue <Packet>();

            listening = true;
            threadIn.Start();
            threadOut.Start();

            WelcomePacket packet = new WelcomePacket();

            packet.clientConnected = true;

            this.SendPacket(packet);
        }
Exemplo n.º 3
0
        private void handleWelcoming(WelcomePacket welcome)
        {
            String token = Client.Instance.readClientSave();

            Console.WriteLine("token : " + token);

            if (token.Equals("no token") || token.Equals("error"))
            {
                UIManager.Instance.RunOnUIThread(() =>
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new LoginForm());
                });
            }

            else
            {
                LoginTokenPacket p = new LoginTokenPacket();
                p.token = token;
                Client.Instance.SendPacket(p);
            }
        }
Exemplo n.º 4
0
        private Task HandleConnectionAsync(TcpClient tcpClient)
        {
            WelcomePacket packet = new WelcomePacket();

            Send(tcpClient, packet.CreatePacket());

            NewsTitlePacket packet2 = new NewsTitlePacket();

            Send(tcpClient, packet2.CreatePacket());

            NewsContentPacket packet3 = new NewsContentPacket();

            Send(tcpClient, packet3.CreatePacket());

            return(Task.Run(async() =>
            {
                using (var networkStream = tcpClient.GetStream())
                {
                    while (true)
                    {
                        var buffer = new byte[4096];
                        Console.WriteLine("[Server] Reading from client");
                        var byteCount = await networkStream.ReadAsync(buffer, 0, buffer.Length);

                        int?size = null;
                        HeadCodeSc?headcode = null;
                        byte type = buffer[0];

                        if (type == 0xC1 || type == 0xC3)
                        {
                            size = buffer[1];
                            headcode = (HeadCodeSc)buffer[2];
                            Console.WriteLine("C1/C3 packet type");
                        }
                        else if (type == 0xC2 || type == 0xC4)
                        {
                            size = buffer[1] * 256;
                            size |= buffer[2];
                            headcode = (HeadCodeSc)buffer[3];
                            Console.WriteLine("C2/C4 packet type");
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("Unknow packet type 0x{0:X}", type);
                            Console.ResetColor();
                            continue;
                        }

                        Console.WriteLine("Read {0} bytes from socket.",
                                          byteCount);
                        Console.WriteLine("Packet type: 0x{0:X} headcode: 0x{1:X} size: 0x{2:X}", type, headcode, size);
                        Console.WriteLine(BitConverter.ToString(buffer, 0, (int)size));

                        try
                        {
                            if (headcode == HeadCodeSc.ConnectServerData)
                            {
                                if ((HeadCodeCs)buffer[3] == HeadCodeCs.ClientConnect)
                                {
                                    ServerListPacket packetData = new ServerListPacket(udpServer);

                                    Send(tcpClient, packetData.CreatePacket());
                                }
                                else if ((HeadCodeCs)buffer[3] == HeadCodeCs.ServerSelect)
                                {
                                    ServerDataPacket packetData = new ServerDataPacket(udpServer, buffer);

                                    Send(tcpClient, packetData.CreatePacket());
                                }
                            }
                        } catch (Exception)
                        {
                        }
                    }
                    //await HandleConnectionAsync(tcpClient);
                }
            }));
        }
Exemplo n.º 5
0
        private void packetManager_PacketReceived(object sender, PacketEventArgs e)
        {
            switch (e.Packet.PacketType)
            {
            case PacketType.Welcome:
                WelcomePacket welcome = e.Packet as WelcomePacket;
                LoginPacket   packet  = new LoginPacket(this.number, this.password, welcome.Seed,
                                                        this.loginStatus, this.channels);
                this.packetManager.AddPacket(packet);
                break;

            // case PacketType.Login80_OK:
            //     this.State = State.Connected;
            //     this.timerPing.Start();
            //     if (this.Connected != null)
            //     {
            //         this.Connected(this, EventArgs.Empty);
            //     }
            //     break;

            case PacketType.Login80_Fail:
                if (this.LoggedFail != null)
                {
                    this.LoggedFail(this, EventArgs.Empty);
                }
                break;

            case PacketType.Disconnect:
                this.State = State.Disconnected;
                this.timerPing.Stop();
                if (this.Disconnected != null)
                {
                    this.Disconnected(this, EventArgs.Empty);
                }
                break;

            case PacketType.Login80_OK:
                this.State = State.Connected;
                this.SendContactList();
                this.timerPing.Start();
                if (this.Connected != null)
                {
                    this.Connected(this, EventArgs.Empty);
                }
                break;

            case PacketType.UserData:
                UserDataPacket userData = e.Packet as UserDataPacket;
                foreach (UserData data in userData.Attributes)
                {
                    if (this.contacts.ContainsKey(data.Number))
                    {
                        this.contacts[data.Number].ExtendedInfo = data.Attributes;
                        if (this.ContactInfoReceived != null)
                        {
                            this.ContactInfoReceived(this, new ContactEventArgs(this.contacts[data.Number]));
                        }
                    }
                }
                break;

            case PacketType.NotifyReply80:
            case PacketType.Status:
                NotifyReplyPacket notify = e.Packet as NotifyReplyPacket;
                foreach (ClientState state in notify.ClientStates)
                {
                    this.contacts[state.Number].State = state;
                    if (this.ContactStateChanged != null)
                    {
                        this.ContactStateChanged(this, new ContactEventArgs(this.contacts[state.Number]));
                    }
                }
                break;

            case PacketType.TypingNotify:
                TypingNotifyPacket typing = e.Packet as TypingNotifyPacket;
                if (this.ContactTyping != null)
                {
                    if (this.contacts.ContainsKey(typing.Number))
                    {
                        GGContact contact = this.contacts[typing.Number];
                        this.ContactTyping(this, new TypingEventArgs(typing.Value, contact));
                    }
                }
                break;

            case PacketType.SendMessageAck:
                SendMessageAckPacket ack = e.Packet as SendMessageAckPacket;
                if (this.messages.ContainsKey(ack.Sequence))
                {
                    GGMessage message = this.messages[ack.Sequence];
                    lock (this.messages)
                    {
                        this.messages.Remove(ack.Sequence);
                    }
                    if (this.MessageStateChanged != null)
                    {
                        this.MessageStateChanged(this, new MessageEventArgs(ack.Status, message));
                    }
                }
                break;

            case PacketType.RecvMessage:
                ReceiveMessagePacket receive = e.Packet as ReceiveMessagePacket;
                GGMessage            msg     = new GGMessage(receive.Recipients);
                msg.Sender       = receive.Sender;
                msg.HtmlMessage  = receive.HtmlMessage;
                msg.PlainMessage = receive.PlainMessage;
                msg.Time         = receive.Time;
                msg.Sequence     = receive.Sequence;

                ReceiveMessageAckPacket confirm = new ReceiveMessageAckPacket(receive.Sequence);
                this.packetManager.AddPacket(confirm);

                if (this.MessageReceived != null)
                {
                    MessageEventArgs args = new MessageEventArgs(MessageStatus.Delivered, msg);
                    this.MessageReceived(this, args);
                }
                break;
            }
        }
Exemplo n.º 6
0
        public void Start()
        {
            Console.WriteLine("GAME SERVER STARTED");
            EventBasedNetListener listener = new EventBasedNetListener();
            NetManager            server   = new NetManager(listener);

            server.Start(9050 /* port */);

            _netSerializer.Register <WelcomePacket>();
            _netSerializer.Register <UpdatePacket>();
            _netSerializer.Register <ServerSnapshotPacket>();
            _netSerializer.Register <EchoPacket>();

            _packetProcessor.SubscribeReusable <UpdatePacket, NetPeer>(HandleClientUpdate);



            listener.ConnectionRequestEvent += request =>
            {
                //we will change this when we create 'game sessions' for now we only support the 4 players.
                if (server.PeersCount < 4 /* max connections */)
                {
                    request.AcceptIfKey("SomeConnectionKey");
                }
                else
                {
                    request.Reject();
                }
            };

            listener.PeerConnectedEvent += peer =>
            {
                //server stores by ipaddress+port
                string key = peer.EndPoint.ToString();
                if (!_knownPlayers.ContainsKey(key))
                {
                    // new unknown player connected, let's start tracking them
                    ServerPlayerData pd = new ServerPlayerData
                    {
                        //generate a unique ID for the peer connecting which will be referenced in the future (by other peers as an intermediary (vs telling peers specifically who they're connected to IP/POrt or whatever)
                        // let's condense this down by 1/3 or so..  (also we know the final characters are ==
                        ClientID      = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace("=", ""),
                        GameSessionId = string.Empty,
                        IPAddress     = peer.EndPoint.Address,
                        Port          = peer.EndPoint.Port,
                        MillisecondsSinceLastHeard = 0,
                        PlayerNumber   = GetNextPlayerId() + 1,
                        PlayerLocation = new Loc {
                            X = 0, Y = 0
                        },
                        _clientRef = peer
                    };
                    bool success = _knownPlayers.TryAdd(key, pd);
                    pd.PlayerLocation.X = pd.PlayerNumber * 15;
                    pd.PlayerLocation.Y = pd.PlayerNumber * 15;
                }
                else
                {
                    //player must have disconnected during a game, let's try to reconnect to their game if it's still playing
                    //TODO: look up the GameSessionID, then start sending this player's packets to all players in the session
                }


                var pdat = _knownPlayers[key];
                Console.WriteLine("PLAYER JOINED: {0} as PLAYER {1} with ID {2}", peer.EndPoint, pdat.PlayerNumber, pdat.ClientID);
                //send our info in a welcome packet
                WelcomePacket wp = new WelcomePacket
                {
                    PlayerId     = pdat.ClientID,
                    PlayerNumber = pdat.PlayerNumber,
                    XStart       = pdat.PlayerLocation.X,
                    YStart       = pdat.PlayerLocation.Y
                };

                _packetProcessor.Send <WelcomePacket>(peer, wp, DeliveryMethod.ReliableOrdered);
                Console.WriteLine("Packet Processor Sent Packet!");
                //peer.Send(_netSerializer.Serialize<WelcomePacket>(wp), DeliveryMethod.ReliableOrdered);
            };

            listener.NetworkReceiveEvent += Listener_NetworkReceiveEvent;

            while (!Console.KeyAvailable)
            {
                server.PollEvents();
                UpdateAllClients(); //sends a snapshot of all client locations every 15ms
                Thread.Sleep(15);
            }
            server.Stop();
        }