private void textBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (client.user.Connected) { client.SendPacket((new Message()).strMessage(client, null, "Logout", Message.DISCONNECTED_TYPE)); } client.logout(); this.Close(); }
//Método de Escuta do Servidor. public void Listen() { while (isServerOnline) { try { TcpClient client = listener.AcceptTcpClient(); UserClient userClient = new UserClient(client); userClient.MessageReceived += messageRecived; userClient.Disconnected += userDisconnect; userClient.SendPacket(new Message().strMessage(null, null, "" + userClient.connection_id, Message.CONNECTED_TYPE)); writeConsole(string.Format("Cliente Conectado: {0}", userClient.current_ip)); } catch (Exception e) { } } }
//Método disparado quando uma mensagem é recebida do usuário. public void messageRecived(UserClient user, string text) { //Instancia um objeto Mensagem, que irá deserializar um texto JSON em um objeto Mensagem Message message = Message.getDeserializedMessage(text); switch (message.msgType) { //Caso o Tipo da Mensagem Seja 0 ou seja Tipo Conectado irá atribuir os dados do usuário e verificará se já há um usuário com os dados dele. case 0: user.nickname = message.from.nickname; user.current_connection_datetime = DateTime.Now; user.current_ping = 0; user.connection_id = Guid.NewGuid().ToString("N"); if (users.FindAll(UserClient => UserClient.nickname.Equals(user.nickname) == true).Count > 0 || user.nickname.Equals("SERVER") || user.nickname.Equals("")) { user.SendPacket(new Message().strMessage(null, null, "Nome já utilizado ou inválido.", Message.DISCONNECTED_TYPE)); user.logout(); writeConsole(message.from.nickname + " repetido KICKADO"); } else { users.Add(user); UserConnected(users); user.SendPacket(new Message().strMessage(null, null, "" + user.connection_id, Message.CONNECTED_TYPE)); writeConsole(message.from.nickname + " entrou"); } break; //Caso seja um tipo de Mensagem Simples irá redistribuir a mensagem recebida para todos usuários. case 1: writeConsole(message.from.nickname + " : " + message.message); SendToAll(new Message().strMessage(message.from, null, message.from.nickname + " : " + message.message + "\n", Message.SIMPLE_MESSAGE_TYPE)); break; //Caso seja um tipo Desconectado irá redistribuir que o usuário foi desconectado para todos usuários. case 3: user.logout(); writeConsole(message.from.nickname + " Saiu"); SendToAll(new Message().strMessage(null, null, JsonConvert.SerializeObject(users.ToArray()), Message.REFRESH_TYPE)); break; //Caso a mensagem seja do Tipo Refresh ( Que pede a lista mais recente de usuários) case 4: SendToAll(new Message().strMessage(null, null, JsonConvert.SerializeObject(users.ToArray()), Message.REFRESH_TYPE)); break; //Caso o server receba uma mensagem do tipo Ping case 5: user.SendPacket(new Message().strMessage(null, null, "pong", Message.PING_TYPE)); break; //Caso receba uma requisição de PING Refresh (atualizar o ping) dispara a ação para a view case 6: try { users.Where(UserClient => user.connection_id.Equals(user.connection_id)).First().current_ping = message.from.current_ping; } catch { } PingRefresh("Refresh"); break; } }