/// <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); } } }
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))); }); }