public Packet TCPRead() { lock (_readLock) { try { int numberOfBytes; if ((numberOfBytes = _reader.ReadInt32()) != -1) { byte[] buffer = _reader.ReadBytes(numberOfBytes); MemoryStream memoryStream = new MemoryStream(buffer); Packet packet = _binaryFormatter.Deserialize(memoryStream) as Packet; //decrypt relevant packets switch (packet.EPacketType) { case PacketType.CHATMESSAGE: ChatMessagePacket chatMessagePacket = (ChatMessagePacket)packet; return(new ChatMessagePacket(Decrypt(chatMessagePacket.OriginClient), Decrypt(chatMessagePacket.Message))); case PacketType.COMMANDMESSAGE: CommandMessagePacket commandMessagePacket = (CommandMessagePacket)packet; return(new CommandMessagePacket(Decrypt(commandMessagePacket.Message))); case PacketType.CLIENTNAME: ClientNamePacket clientNamePacket = (ClientNamePacket)packet; return(new ClientNamePacket(Decrypt(clientNamePacket.ClientName))); } return(packet); } else { return(null); } } catch (Exception e) { Console.WriteLine("[Error] " + e.Message + e.StackTrace); return(null); } } }
public void SetNickname(string nickname) { if (nickname.Length >= 3 && !nickname.Contains(" ") && nickname.Length <= 11) { ClientNamePacket clientNamePacket = new ClientNamePacket(EncryptString(nickname)); TCPSerialize(clientNamePacket); return; } //check if it is too over 10 characters if (nickname.Length > 11) { _clientForm.UpdateChatWindow("[Error] Your nickname cannot be longer than 11 characters!"); _clientForm.Nickname.Focus(); } //check if it has spaces if (nickname.Contains(" ")) { _clientForm.UpdateChatWindow("[Error] Your nickname cannot have spaces!"); _clientForm.Nickname.Focus(); } //check if nickname is too small or not inputted if (nickname.Length < 3 && nickname != "") { _clientForm.UpdateChatWindow("[Error] Your nickname must be atleast 3 characters long!"); _clientForm.Nickname.Focus(); } else if (nickname == "") { _clientForm.UpdateChatWindow("[Error] Please enter a nickname!"); _clientForm.Nickname.Focus(); } _clientForm.Nickname.Focus(); }
private void TcpProcessServerResponse() { try { int numberOfBytes; while ((numberOfBytes = m_Reader.ReadInt32()) != -1) { byte[] buffer = m_Reader.ReadBytes(numberOfBytes); MemoryStream memoryStream = new MemoryStream(buffer); Packet packet = m_Formatter.Deserialize(memoryStream) as Packet; switch (packet.packetType) { case PacketType.CHATMESSAGE: ChatMessagePacket chatMessage = (ChatMessagePacket)packet; m_clientForm.UpdateChatWindow(chatMessage.message); break; case PacketType.PRIVATEMESSAGE: break; case PacketType.CLIENTNAME: ClientNamePacket clientName = (ClientNamePacket)packet; m_clientForm.UpdatePeopleList(clientName.name); break; default: break; } } } catch (SocketException e) { Console.WriteLine("Client TCP Read Method exception: " + e.Message); } }
void TcpClientMethod(int index) { Console.WriteLine("Socket opened. (" + _tcpListener.ToString() + ")"); Packet receivedPacket; Client client = _clients[index]; try { while ((receivedPacket = client.TcpRead()) != null) { Console.Write("TCP Receieved: "); // act on packet type switch (receivedPacket._packetType) { case Packet.PacketType.EMPTY: Console.WriteLine("EMPTY"); /* do nothing */ break; case Packet.PacketType.CHATMESSAGE: Console.WriteLine("CHAT"); TcpRespondToAll((ChatMessagePacket)receivedPacket, client); break; case Packet.PacketType.PRIVATEMESSAGE: Console.WriteLine("PRIVATE"); TcpRespondTo((PrivateMessagePacket)receivedPacket, client); break; case Packet.PacketType.SERVERMESSAGE: Console.WriteLine("SERVER"); ServerMessagePacket servPacket = (ServerMessagePacket)receivedPacket; servPacket._messageRecv = GetReturnMessage(servPacket._messageSent); client.TcpSend(servPacket); break; case Packet.PacketType.CLIENTNAME: Console.WriteLine("NAME"); ClientNamePacket namePacket = (ClientNamePacket)receivedPacket; // create message namePacket._message = client._name + " changed name to " + namePacket._name; // change name client._name = namePacket._name; // update client client.TcpSend(namePacket); // notify all clients TcpRespondToAll(new ChatMessagePacket(namePacket._message), client); break; case Packet.PacketType.LOGIN: Console.WriteLine("LOGIN"); LoginPacket loginPacket = (LoginPacket)receivedPacket; client._endPoint = loginPacket._endPoint; loginPacket._serverKey = client.UpdateRSA(loginPacket); client.TcpSend(loginPacket); break; case Packet.PacketType.SECUREMESSAGE: Console.WriteLine("SECURE"); // receive packet SecurePacket safePacket = (SecurePacket)receivedPacket; // transmit packet TcpSecureRespondToAll( client.GetSecureMessage(safePacket), safePacket._packetSrc ); break; case Packet.PacketType.ERROR: //should be for other things, in another place Console.WriteLine("ERROR"); ErrorMessagePacket errPacket = (ErrorMessagePacket)receivedPacket; client.TcpSend(errPacket); break; case Packet.PacketType.ENDSESSION: Console.Write("ENDING TCP SESSION: " + client._name); // signal to client to close connections // and end while loop client.Close(); break; case Packet.PacketType.JOINGAME: Console.Write("JOIN GAME - "); JoinGamePacket joinGame = (JoinGamePacket)receivedPacket; Client host = null; foreach (Client user in _clients.Values) { if (user._name == joinGame._targetHost) { host = user; } } //ChatMessagePacket resultPacket = null; if (GameSession.Instance.JoinSession(ref client, host)) { Console.WriteLine("JOINED A GAME"); //success - msg client PrivateMessagePacket resultPacket = new PrivateMessagePacket(client._name, "Started Game Session") { _packetSrc = _serverName }; TcpRespondTo(resultPacket, client); //launch client's game client.TcpSend(joinGame); } else { Console.WriteLine("FAILED TO JOIN A GAME"); //failed - msg client }; break; case Packet.PacketType.USERLIST: Console.WriteLine("USERLIST"); UserListPacket userList = (UserListPacket)receivedPacket; if (userList._users == null) { List <string> usernames = new List <string>(); // collect user names foreach (KeyValuePair <int, Client> c in _clients) { usernames.Add(c.Value._name); } userList._users = usernames.ToArray(); TcpSendToAll(userList); } // if list is filled, why is it here?! break; case Packet.PacketType.LEAVEGAME: LeaveGamePacket leaveGame = (LeaveGamePacket)receivedPacket; // check game sessions bool wasHost = GameSession.Instance.IsHosting(client); // update game session List <string> players = GameSession.Instance.LeaveSession(ref client); ServerMessagePacket serverMessage = null; if (!leaveGame._wasForced) { serverMessage = new ServerMessagePacket (client._name + " has left the game.", null); } else { serverMessage = new ServerMessagePacket ("GAME ERROR: " + client._name + " was forced to leave the game.", null); } foreach (Client user in _clients.Values) { if (players.Contains(user._name)) { user.TcpSend(serverMessage); } } if (wasHost) { leaveGame._wasForced = true; foreach (Client user in _clients.Values) { user.TcpSend(leaveGame); } } break; default: break; } } } catch (Exception e) { Console.WriteLine("Error: " + e.Message); if (client != null) { Console.WriteLine("Client: " + client._name); } } client.Close(); _clients.TryRemove(index, out client); }
private void TCPClientMethod(int index) { Packet receivedPacket; //loop to allow continuous communication while((receivedPacket = _clients[index].TCPRead()) != null) { try { switch (receivedPacket.EPacketType) { case PacketType.EMPTY: EmptyPacket emptyPacket = (EmptyPacket)receivedPacket; break; case PacketType.CHATMESSAGE: ChatMessagePacket chatMessagePacket = (ChatMessagePacket)receivedPacket; try { //reencrypt data into new packet so that all the clients are able to decrypt it with their private key ChatMessagePacket sendPacket = new ChatMessagePacket(UTF8.GetBytes(_clients[index].clientData.clientNickname), chatMessagePacket.Message) { Time = chatMessagePacket.Time }; //send messages to all clients TCPSendPacketToAll(sendPacket); //print client messages to server console OutputLog(chatMessagePacket.Time + " " + _clients[index].clientData.clientNickname + ": " + UTF8.GetString(chatMessagePacket.Message)); } catch (Exception e) { OutputLog("[Error] " + e.Message + e.StackTrace); break; } break; case PacketType.COMMANDMESSAGE: CommandMessagePacket commandMessagePacket = (CommandMessagePacket)receivedPacket; //Process command ProcessCommand(_clients[index], UTF8.GetString(commandMessagePacket.Message)); break; case PacketType.CLIENTNAME: ClientNamePacket clientNamePacket = (ClientNamePacket)receivedPacket; bool uniqueName = true; for(int i = 0; i < _clients.Count; i++) { if(UTF8.GetString(clientNamePacket.ClientName) == _clients[i].clientData.clientNickname) { uniqueName = false; } } if(uniqueName) { OutputLog("[Nickname] " + _clients[index].clientData.clientNickname + " has changed their nickname to " + UTF8.GetString(clientNamePacket.ClientName) + "."); _clients[index].clientData.clientNickname = UTF8.GetString(clientNamePacket.ClientName); //Refresh client list ClientListPacket clientListPacket = new ClientListPacket(GetClientNames(), GetClientAddresses()); TCPSendPacketToAll(clientListPacket); //Send name change confirmation ServerMessagePacket serverMessagePacket = new ServerMessagePacket(UTF8.GetBytes("Your server nickname has been changed to " + UTF8.GetString(clientNamePacket.ClientName) + "!")); _clients[index].TCPSend(serverMessagePacket); } else { //Send name change failed ServerMessagePacket serverMessagePacket = new ServerMessagePacket(UTF8.GetBytes("Someone on this server already has the nickname '" + UTF8.GetString(clientNamePacket.ClientName) + "'. Please choose a different nickname!")); _clients[index].TCPSend(serverMessagePacket); } break; case PacketType.DISCONNECTREQUEST: DisconnectRequestPacket disconnectRequestPacket = (DisconnectRequestPacket)receivedPacket; //Announce client has joined to all clients ServerMessagePacket serverMessagePacket3 = new ServerMessagePacket(UTF8.GetBytes(_clients[index].clientData.clientNickname + " has left the server!")); TCPSendPacketToAll(serverMessagePacket3); _clients[index].Close(); break; case PacketType.LOGIN: LoginPacket loginPacket = (LoginPacket)receivedPacket; try { //set server client ip and client key _clients[index].clientData.ipEndPoint = loginPacket.EndPoint; _clients[index]._clientKey = loginPacket.PublicKey; //send server public key back ServerKeyPacket serverKeyPacket = new ServerKeyPacket(_clients[index]._publicKey, true); _clients[index].TCPSend(serverKeyPacket); _clients[index].successfulLogin = true; //Announce client has joined to all clients ServerMessagePacket serverMessagePacket2 = new ServerMessagePacket(UTF8.GetBytes(_clients[index].clientData.clientNickname + " has joined the server!")); TCPSendPacketToAll(serverMessagePacket2); //Refresh client list ClientListPacket clientListPacket2 = new ClientListPacket(GetClientNames(), GetClientAddresses()); TCPSendPacketToAll(clientListPacket2); break; } catch (Exception e) { OutputLog("[Error] " + e.Message + e.StackTrace); break; } } } catch (Exception e) { OutputLog("[Error] " + e.Message + e.StackTrace); break; } } try { _clients[index].Close(); //Take client out of client ConcurrentBag _clients.TryRemove(index, out Client c); } catch (Exception e) { OutputLog("[Error] " + e.Message + e.StackTrace); } }
private void TcpProcessServerPacket() { Packet packet = new Packet(); while (_net.IsTcpConnected) { packet = _net.TcpReadPacket(); Debug("TcpProcessServerPacket: packet = " + packet); if (packet != null) { switch (packet._packetType) { case Packet.PacketType.EMPTY: /* do nothing */ break; case Packet.PacketType.CLIENTNAME: ClientNamePacket namePacket = (ClientNamePacket)packet; _win.name = namePacket._name; _nick = namePacket._name; break; case Packet.PacketType.CHATMESSAGE: ChatMessagePacket chatPacket = (ChatMessagePacket)packet; _win.UpdateChat(chatPacket._message); break; case Packet.PacketType.PRIVATEMESSAGE: PrivateMessagePacket privPacket = (PrivateMessagePacket)packet; _win.UpdateChat(privPacket._packetSrc + ": " + privPacket._message); break; case Packet.PacketType.LOGIN: Console.WriteLine("Logged in to server."); _net.TcpFinishLogin((LoginPacket)packet); break; case Packet.PacketType.SECUREMESSAGE: SecurePacket safePacket = (SecurePacket)packet; _win.UpdateChat( "Secure Message Received [" + safePacket._packetSrc + "]: " + _net.DecryptString(safePacket._data) ); break; case Packet.PacketType.ENDSESSION: Console.WriteLine("Disconnecting from server."); _net.Close(); break; case Packet.PacketType.JOINGAME: _win.StartGame(this); break; case Packet.PacketType.USERLIST: UserListPacket userList = (UserListPacket)packet; _win.UserList = userList._users; break; case Packet.PacketType.LEAVEGAME: LeaveGamePacket leaveGame = (LeaveGamePacket)packet; if (leaveGame._wasForced) { _win.StopGame(); } break; case Packet.PacketType.SERVERMESSAGE: ServerMessagePacket serverMessage = (ServerMessagePacket)packet; _win.UpdateChat(serverMessage._messageSent); break; } } } }