




Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Neste artigo, aprenda a criar um chat simples e objetivo, mantendo-se o processo o mais fácil possível. Saiba como criar um cliente que se conecta com o servidor, envia e recebe mensagens. Nosso caminho incluirá conhecimentos básicos em multi-threading, eventos e delegates, e redes. Iniciamos criando o cliente.
Tipologia: Esquemas
1 / 8
Esta página não é visível na pré-visualização
Não perca as partes importantes!
Neste artigo eu vou mostrar como criar um Chat procurando ser bem objetivo e mantendo as coisas o simples possível.
Na verdade uma aplicação de Chat (bate-papo) consiste em duas aplicações:
O cliente - Se conecta com o servidor envia e recebe mensagens; O Servidor - que trata as conexões, armazenando-as em uma hash table e distribui as mensagens para quem estiver conectado; (O servidor do Chat será capaz de aceitar tantos clientes quanto forem permitidos pela hash table(você pode definir um limite na tabela), e que também irá acompanhar todas as mensagens que estão indo e voltando em sua propria janela do chat.)
Para poder acompanhar e entender tudo que vamos fazer é necessário que se tenha conhecimento sobre os seguintes tópicos:
Multi-Threading Eventos, Delegates Redes
Vamos iniciar criando o cliente.
A aplicação cliente é a mais simples, já que tudo o que ela tem a fazer é tentar se conectar ao servidor de bate-papo, pedir um nome de usuário, começar a ouvir as mensagens e enviar suas próprias e, finalmente, desligar.
Inicie o Visual C# 2010 Express Edition e crie um novo projeto do tipo Windows Appliation com o nome ChatCliente :
Vamos alterar o nome do formulário form1.cs criado por padrão no projeto para frmCliente.cs e a seguir definir o leiaute conforme mostra a figura abaixo no formulário:
private IPAddress enderecoIP; private bool Conectado;
3- Código do evento Click do botão Conectar que verifica se estamos conectados e inicia a conexão;
private void btnConectar_Click(object sender, System.EventArgs e) { // se não esta conectando aguarda a conexão if (Conectado == false) { // Inicializa a conexão InicializaConexao(); } else // Se esta conectado entao desconecta { FechaConexao("Desconectado a pedido do usuário."); } }
private void InicializaConexao() {
// Trata o endereço IP informado em um objeto IPAdress enderecoIP = IPAddress.Parse(txtServidorIP.Text); // Inicia uma nova conexão TCP com o servidor chat tcpServidor = new TcpClient(); tcpServidor.Connect(enderecoIP, 2502);
// AJuda a verificar se estamos conectados ou não Conectado = true;
// Prepara o formulário NomeUsuario = txtUsuario.Text;
// Desabilita e habilita os campos apropriados txtServidorIP.Enabled = false; txtUsuario.Enabled = false; txtMensagem.Enabled = true; btnEnviar.Enabled = true; btnConectar.Text = "Desconectado";
// Envia o nome do usuário ao servidor stwEnviador = new StreamWriter(tcpServidor.GetStream()); stwEnviador.WriteLine(txtUsuario.Text); stwEnviador.Flush();
//Inicia a thread para receber mensagens e nova comunicação mensagemThread = new Thread(new ThreadStart(RecebeMensagens)); mensagemThread.Start(); }
private void RecebeMensagens() { // recebe a resposta do servidor strReceptor = new StreamReader(tcpServidor.GetStream()); string ConResposta = strReceptor.ReadLine(); // Se o primeiro caracater da resposta é 1 a conexão foi feita com sucesso if (ConResposta[0] == '1') { // Atualiza o formulário para informar que esta conectado this.Invoke(new AtualizaLogCallBack(this.AtualizaLog), new object[] { "Conectado com sucesso!" }); } else // Se o primeiro caractere não for 1 a conexão falhou { string Motivo = "Não Conectado: "; // Extrai o motivo da mensagem resposta. O motivo começa no 3o caractere Motivo += ConResposta.Substring(2, ConResposta.Length - 2); // Atualiza o formulário como o motivo da falha na conexão this.Invoke(new FechaConexaoCallBack(this.FechaConexao), new object[] { Motivo }); // Sai do método return; }
// Enquanto estiver conectado le as linhas que estão chegando do servidor while (Conectado) { // exibe mensagems no Textbox this.Invoke(new AtualizaLogCallBack(this.AtualizaLog), new object[] { strReceptor.ReadLine() }); } }
Um novo leitor dee stream está ligado ao cliente TCP. Ele vai ouvir as mensagens recebidas. Mas antes de tudo, lemos a primeira linha vindo do servidor. O motivo é que sabemos que a primeira linha contém uma resposta nos dizendo se estamos ou não conectados com êxito.
Para enviar uma mensagem usamos o evento click do botão Enviar ou quando a tecla Enter for pressionada. Nestes casos chamamos a rotina EnviaMensagem () conforme os itens 7 e 8 acima.
9- Código da rotina EnviaMensagem
// Envia a mensagem para o servidor private void EnviaMensagem() { if (txtMensagem.Lines.Length >= 1) { //escreve a mensagem da caixa de texto stwEnviador.WriteLine(txtMensagem.Text); stwEnviador.Flush(); txtMensagem.Lines = null; } txtMensagem.Text = ""; }
A rotina EnviaMenagem() apenas verifica se o número de linhas é maior ou igual a 1, e então escreve a linha para a conexão TCP através do objeto StreamWriter. A chamda ao método Flush() garante que as mensagens estão sendo enviadas de imediato.
10 - Código da rotina FechaConexao
// Fecha a conexão com o servidor private void FechaConexao(string Motivo) { // Mostra o motivo porque a conexão encerrou txtLog.AppendText(Motivo + "\r\n"); // Habilita e desabilita os controles apropriados no formulario txtServidorIP.Enabled = true; txtUsuario.Enabled = true; txtMensagem.Enabled = false; btnEnviar.Enabled = false; btnConectar.Text = "Conectado";
// Fecha os objetos Conectado = false; stwEnviador.Close(); strReceptor.Close(); tcpServidor.Close(); }
Para fechar a conexão chamamos o método FechaConexao e neste código temos que o formulário está sendo trazido de volta para o estado não conectado, e a conexão TCP e os streams estão sendo fechados. Mas o que acontece se o usuário não clicar para desconectar mas apenas fechar o aplicativo enquanto a conexão com o servidor está ativa?
Nós certamente não queremos deixar a conexão aberta como esta até que ele morra por conta própria. Felizmente existe o evento ApplicationExit que é acionado quando o aplicativo for fechado, e é aí que podemos fechar a nossa
conexão. Para tratar este evento vamos alterar o código do construtor do formulário conforme abaixo:
11- Definição do tratamento do evento ApplicationOnExit
public frmCliente() { // Na saida da aplicação : desconectar Application.ApplicationExit += new EventHandler(OnApplicationExit); InitializeComponent(); }
12- Código do evento OnApplicationExit()
// O tratador de evento para a saida da aplicação public void OnApplicationExit(object sender, EventArgs e) { if (Conectado == true) { // Fecha as conexões, streams, etc... Conectado = false; stwEnviador.Close(); strReceptor.Close(); tcpServidor.Close(); } }
O código do evento OnApplicationExit() vai ocorrer quando o usuário fechar o aplicativo diretamente com a conexão ativa e vai verificar se estamos conectados e fechar as conexões e os recursos usados
Pegue a primeira parte do projeto completo aqui: ChatCliente.zip
Na segunda parte do artigo irei mostrar a criação do Servidor que irá receber