Esempio n. 1
0
        /// <summary>
        /// Server receives messages from the clients
        /// </summary>
        public void RecvMessage()
        {
            while (alive)
            {
                try
                {
                    byte[] Pkg = server.Receive(ref clientes);
                    switch (Pkg[0])
                    {
                    case PkgInterf.HELLO:
                        if (Search(clientes.Address.ToString(), clientes.Port) == null)
                        {
                            byte[] idtosend = new byte[4];
                            idtosend = BitConverter.GetBytes(IDcont);
                            insert(clientes.Address.ToString(), clientes.Port, PkgMngr.Translate(PkgMngr.TrimByteArray(1, Pkg.Length, Pkg)));
                            Console.WriteLine("Connection incoming [{0}:{1}]", clientes.Address.ToString(), clientes.Port);
                            sendDirect(PkgInterf.HANDSHAKE, idtosend, clientes.Address, clientes.Port);
                            //SendEverybodyID(clientes.Address, clientes.Port);
                        }
                        break;

                    case PkgInterf.GOODBYE:
                        if (Search(clientes.Address.ToString(), clientes.Port) != null)
                        {
                            Client temp = Search(clientes.Address.ToString(), clientes.Port);
                            remove(temp.Id, "Disconnected Safely");
                        }
                        else
                        {
                            sendDirect(PkgInterf.ERROR, clientes.Address, clientes.Port);
                        }
                        break;

                    case PkgInterf.PING:
                        if (Search(clientes.Address.ToString(), clientes.Port) != null)
                        {
                            Search(clientes.Address.ToString(), clientes.Port).TimeOut = 0;
                        }
                        else
                        {
                            sendDirect(PkgInterf.ERROR, clientes.Address, clientes.Port);
                        }
                        break;

                    case PkgInterf.SYNC:
                        if (Search(clientes.Address.ToString(), clientes.Port) != null)
                        {
                            /*1-XXXX-YYYY-ZZZZ*/
                            Client temp = Search(clientes.Address.ToString(), clientes.Port);
                            temp.SetPositionByByteArray(PkgMngr.TrimByteArray(1, 13, Pkg));
                        }
                        else
                        {
                            sendDirect(PkgInterf.ERROR, clientes.Address, clientes.Port);
                        }
                        break;

                    case PkgInterf.INPUT:
                        /*It will send to all players the input to of an player
                         * but syncing his position and rotation before all thing*/
                        if (Search(clientes.Address.ToString(), clientes.Port) != null)
                        {
                            /*H-I-P-IDID-XXXX-YYYY-ZZZZ-X-Y-Z
                             * HEADER :     3		    UNSIGNED CHAR/BYTE
                             * INPUTKEY :   0-255       UNSIGNED CHAR/BYTE	BUTTON PRESSED
                             * PWM :        0-255		BOOL/BYTE		    PWM BUTTON ON-OFF
                             * IDID :		2^32		INT32			    PLAYER ID
                             * XXXX :		0.0000		FLOAT			    X Position.
                             * YYYY :		0.0000		FLOAT			    Y Position.
                             * ZZZZ :		0.0000		FLOAT			    Z Position.
                             * X :		    0-255		BYTE			    X Rotation.
                             * Y :		    0-255		BYTE			    Y Rotation.
                             * Z :		    0-255		BYTE			    Z Rotation.*/
                            Client temp = Search(clientes.Address.ToString(), clientes.Port);
                            temp.NewInput(Pkg);
                        }
                        else
                        {
                            sendDirect(PkgInterf.ERROR, clientes.Address, clientes.Port);
                        }
                        break;

                    case PkgInterf.CHAT:
                        if (Search(clientes.Address.ToString(), clientes.Port) != null)
                        {
                            Client clien = Search(clientes.Address.ToString(), clientes.Port);
                            Console.WriteLine(clien.Name + ": " + PkgMngr.Translate(Pkg));
                        }
                        else
                        {
                            sendDirect(PkgInterf.ERROR, clientes.Address, clientes.Port);
                        }
                        break;

                    case PkgInterf.INFO:
                        Broadcast(Pkg, false);
                        break;

                    case PkgInterf.REQUEST:
                        Client temp_client = Search(clientes.Address.ToString(), clientes.Port);
                        if (temp_client != null)
                        {
                            byte[] idtosend = new byte[4];
                            idtosend = temp_client.GetID();
                            sendDirect(PkgInterf.HANDSHAKE, idtosend, clientes.Address, clientes.Port);
                        }
                        break;

                    default:
                        if (Search(clientes.Address.ToString(), clientes.Port) != null)
                        {
                            Client clien = Search(clientes.Address.ToString(), clientes.Port);
                            Console.WriteLine(clien.Name + ": " + PkgMngr.Translate(Pkg) + " (Using an unkown header)");
                        }
                        else
                        {
                            Console.WriteLine("Invalid Session!");
                            sendDirect(PkgInterf.ERROR, clientes.Address, clientes.Port);
                        }
                        break;
                    }
                }
                catch (SocketException e)
                {
                    Console.WriteLine("Trying Communication. error: " + e.Message);
                }
            }
        }
Esempio n. 2
0
 public WSServer(UDPnetKode Translator, int port = 8585)
 {
     SocketServer = Translator;
     WSS          = new WebSocketServer("ws://0.0.0.0:" + port);
     WSS.Start(socket =>
     {
         socket.OnOpen    = () => Console.WriteLine("Open!");
         socket.OnClose   = () => Console.WriteLine("Close!");
         socket.OnMessage = message => Translator.sendDirect(PkgMngr.GetBytes(message[0]), PkgMngr.TrimByteArray(1, message.Length, PkgMngr.GetBytes(message)));
     });
 }