public void Run() { try { NetworkStream ns = client.GetStream(); byte[] buffer = new byte[client.ReceiveBufferSize]; int bytesRead = ns.Read(buffer, 0, client.ReceiveBufferSize); nome = Encoding.UTF8.GetString(buffer, 0, bytesRead); if (string.IsNullOrEmpty(nome)) { Enviar("m", "Você precisa fornecer um nome."); servidorForm.clientes.Remove(this); Fechar(); return; } if (nome.Length < 3 || nome.Length > 20 || nome.Contains(" ")) { Enviar("m", "O nome deve ter de 3 à 20 caracteres e não pode ter espaços."); servidorForm.clientes.Remove(this); Fechar(); return; } if (nome.ToLower().Equals("servidor")) { Enviar("m", "O nome 'Servidor' é reservado."); servidorForm.clientes.Remove(this); Fechar(); return; } foreach (Cliente cliente in servidorForm.clientes) { if (!this.Equals(cliente) && nome.ToLower().Equals(cliente.GetNome().ToLower())) { Enviar("m", "O nome '" + nome + "' já está em uso."); servidorForm.clientes.Remove(this); Fechar(); return; } } servidorForm.AddMensagem(nome + " entrou no chat. (" + ip + ")"); Enviar("p", nome + " " + servidorForm.GetParticipantes()); servidorForm.AddParticipante(ip, nome); foreach (Cliente cliente in servidorForm.clientes) { if (!this.Equals(cliente)) { cliente.Enviar("e", nome + " entrou no chat."); } } } catch (Exception) { servidorForm.clientes.Remove(this); Fechar(); } int mensagensVazias = 0; while (conectado) { try { NetworkStream ns = client.GetStream(); byte[] buffer = new byte[client.ReceiveBufferSize]; int bytesRead = ns.Read(buffer, 0, client.ReceiveBufferSize); string mensagem = Encoding.UTF8.GetString(buffer, 0, bytesRead); if (!string.IsNullOrEmpty(mensagem)) { mensagensVazias = 0; servidorForm.AddMensagem(nome + ": " + mensagem); foreach (Cliente cliente in servidorForm.clientes) { if (!this.Equals(cliente)) { cliente.Enviar("m", nome + ": " + mensagem); } } } else if (mensagensVazias == 3) { throw new SocketException(); } else { mensagensVazias++; } } catch (Exception) { if (conectado) { servidorForm.AddMensagem(nome + " saiu do chat. (" + ip + ")"); servidorForm.clientes.Remove(this); servidorForm.RemoverParticipante(ip, nome); try { foreach (Cliente cliente in servidorForm.clientes) { cliente.Enviar("s", nome + " saiu do chat."); } } catch (Exception e) { Console.WriteLine(e); } finally { Fechar(); } } } } }