//Ação quando um usuário desconecta public void userDisconnect(UserClient user, string text) { users.Remove(user); UserDisconnected(users); writeConsole(user.nickname + " Saiu"); SendToAll(new Message().strMessage(null, null, JsonConvert.SerializeObject(users.ToArray()), Message.REFRESH_TYPE)); }
//METODO CONSTRUTOR public string strMessage(UserClient from, UserClient to, string message, int msgType) { this.from = from; this.to = to; this.message = message; this.msgType = msgType; return(getSerializedMessage()); }
public void disconnect(UserClient user, string reason) { if (reason != "") { MessageBox.Show("Desconectando... Razão: " + reason); } this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => 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) { } } }
public void messageRecived(UserClient user, string text) { try { messageAssist += text; Message message = Message.getDeserializedMessage(messageAssist); switch (message.msgType) { case 0: user.connection_id = message.message; break; case 1: this.serverConsole.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => textWithColor(this.serverConsole, message.message, message.from.color))); this.serverConsole.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => this.serverConsole.ScrollToEnd())); break; case 3: user.kick(message.message); break; case 4: users = JsonConvert.DeserializeObject <List <UserClient> >(message.message); this.lvConnectedUsers.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => this.lvConnectedUsers.ItemsSource = users)); this.lvConnectedUsers.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => this.lvConnectedUsers.Items.Refresh())); break; case 5: user.current_ping = user.getPong(); users.Find(UserClient => UserClient.connection_id == user.connection_id).current_ping = user.current_ping; client.SendPacket((new Message()).strMessage(user, null, JsonConvert.SerializeObject(user), Message.REFRESH_PING_TYPE)); this.lvConnectedUsers.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => this.lvConnectedUsers.Items.Refresh())); break; case 6: UserClient userRefresh = JsonConvert.DeserializeObject <UserClient>(message.message); if (userRefresh.connection_id != user.connection_id) { users.Find(UserClient => UserClient.connection_id == userRefresh.connection_id).current_ping = userRefresh.current_ping; this.lvConnectedUsers.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => this.lvConnectedUsers.Items.Refresh())); } break; } messageAssist = ""; } catch (Exception e) { } }
public void Show(UserClient client, String ip, UserForm userForm) { this.client = client; ipAddress = ip; userForm.Close(); try { client.MessageReceived += messageRecived; client.Disconnected += disconnect; client.connectToServer(IPAddress.Parse(ipAddress), 56863); pingerThread = new Thread(Ping); pingerThread.IsBackground = true; pingerThread.Start(); txtMensagem.Focus(); lvConnectedUsers.ItemsSource = users; } catch (Exception ex) { MessageBox.Show(ex.Message); btnEnviar.IsEnabled = false; txtMensagem.IsEnabled = false; } this.Show(); }
//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; } }