Avaliação do Usuário

Estrela inativaEstrela inativaEstrela inativaEstrela inativaEstrela inativa
 

CRIANDO UM CHAT EM C#

Com o seu chat pronto, agora iremos criar o servidor para enviar e receber as mensagens que o receptor (chat) irá visualizar.

Agora, vamos começar o nosso projeto:

  • Abra o C# Express, clique no botão new Project;


  • Clique em “Windows Forms Application”, de um nome para seu projeto e clique em OK;

 

 

  • Altere o nome de seu formulário (Form1.cs), para frmServidor.cs, na mensagem que aparecer clique em Sim;

  • No seu formulário insira 4 componentes, sendo eles: 1 Label, 1 Button e 2 TexBox;

  • Altere as propriedades dos componentes conforme a tabela abaixo:

 

Componente Name Text
Label1 Label1 Endereço IP
Button1 btnConectar Iniciar Conexão
TexBox1 txtIP  
TexBox2 txtLog  

 

  • Com as propriedades dos componentes devidamente alteradas, de um duplo clique no botão, suba a página até o topo e digite o seguinte comando:

 

{code}

Using System.Net;

{/code}

 

 

  • Encontre o comando “public frmServidor()”, conte 5 linhas para baixo, de um enter e digite o seguinte comando:

 

{code}

private delegate void AtualizaStatusCallback(string strMensagem);

{/code}

 

  • Volte para o formulário, de um duplo clique no botão, e digite o seguinte comando:

 

{code}

IPAddress enderecoIP = IPAddress.Parse(txtIP.Text);

ChatServidor mainServidor = new ChatServidor(enderecoIP);

ChatServidor.StatusChanged += new StatusChangedEventHandler(mainServer_StatusChanged);

mainServidor.IniciaAtendimento();

txtLog.AppendText("Monitorando as conexões...\r\n");

{/code}

 

 

  • Feito isso, digite o seguinte comando:

 

{code}

public void mainServidor_StatusChanged(object sender, StatusChangedEventArgs e)

{

this.Invoke(new AtualizaStatusCallback(this.AtualizaStatus), new object[] { e.EventMessage });

}

 

private void AtualizaStatus(string strMensagem)

{

txtLog.AppendText(strMensagem + "\r\n");

}

{/code}

 

  • Agora iremos criar uma classe chamada ChatServidor.cs, para fazer isso clique no menu “Project” e na opção “Add Class...”;

 

  • Depois de selecione a opção Class, mude o nome para ChatServidor.cs e clique em Add;

 

 

  • Feito isso, suba a página até o topo e digite os seguintes comandos:

 

{code}

using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections;

{/code}

 

  • Antes do comando( Class ChatServidor ), digite o seguinte comando:

 

{code}

public class StatusChangedEventArgs : EventArgs

{

private string EventMsg;

public string EventMessage

{

get { return EventMsg; }

set { EventMsg = value; }

}

public StatusChangedEventArgs(string strEventMsg)

{

EventMsg = strEventMsg;

}

}

 

{/code}

 

  • Feito isso digite o seguinte comando:

 

{code}

public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e);

{/code}

 

  • Logo após o comando ( Class ChatServidor ), digite o comando:

 

{code}

public static Hashtable htUsuarios = new Hashtable(30);

public static Hashtable htConexoes = new Hashtable(30);

private IPAddress enderecoIP;

private TcpClient tcpCliente;

public static event StatusChangedEventHandler StatusChanged;

private static StatusChangedEventArgs e;

public ChatServidor(IPAddress endereco)

{

enderecoIP = endereco;

}

private Thread thrListener;

private TcpListener tlsCliente;

bool ServRodando = false;

public static void IncluiUsuario(TcpClient tcpUsuario, string strUsername)

{

ChatServidor.htUsuarios.Add(strUsername, tcpUsuario);

ChatServidor.htConexoes.Add(tcpUsuario, strUsername);

EnviaMensagemAdmin(htConexoes[tcpUsuario] + " entrou..");

}

public static void RemoveUsuario(TcpClient tcpUsuario)

{

if (htConexoes[tcpUsuario] != null)

{

EnviaMensagemAdmin(htConexoes[tcpUsuario] + " saiu...");

ChatServidor.htUsuarios.Remove(ChatServidor.htConexoes[tcpUsuario]);

ChatServidor.htConexoes.Remove(tcpUsuario);

}

}

public static void OnStatusChanged(StatusChangedEventArgs e)

{

StatusChangedEventHandler statusHandler = StatusChanged;

if (statusHandler != null)

{

statusHandler(null, e);

}

}

public static void EnviaMensagemAdmin(string Mensagem)

{

StreamWriter swSenderSender;

e = new StatusChangedEventArgs("Administrador: " + Mensagem);

OnStatusChanged(e);

TcpClient[] tcpClientes = new TcpClient[ChatServidor.htUsuarios.Count];

ChatServidor.htUsuarios.Values.CopyTo(tcpClientes, 0);

for (int i = 0; i < tcpClientes.Length; i++)

{

try

{

if (Mensagem.Trim() == "" || tcpClientes[i] == null)

{

continue;

}

swSenderSender = new StreamWriter(tcpClientes[i].GetStream());

swSenderSender.WriteLine("Administrador: " + Mensagem);

swSenderSender.Flush();

swSenderSender = null;

}

catch

{

RemoveUsuario(tcpClientes[i]);

}

}

}

public static void EnviaMensagem(string Origem, string Mensagem)

{

StreamWriter swSenderSender;

e = new StatusChangedEventArgs(Origem + " disse : " + Mensagem);

OnStatusChanged(e);

TcpClient[] tcpClientes = new TcpClient[ChatServidor.htUsuarios.Count];

ChatServidor.htUsuarios.Values.CopyTo(tcpClientes, 0);

for (int i = 0; i < tcpClientes.Length; i++)

{

try

{

if (Mensagem.Trim() == "" || tcpClientes[i] == null)

{

continue;

}

swSenderSender = new StreamWriter(tcpClientes[i].GetStream());

swSenderSender.WriteLine(Origem + " disse: " + Mensagem);

swSenderSender.Flush();

swSenderSender = null;

}

catch

{

RemoveUsuario(tcpClientes[i]);

}

}

}

 

public void IniciaAtendimento()

{

try

{

IPAddress ipaLocal = enderecoIP;

tlsCliente = new TcpListener(ipaLocal, 2502);

tlsCliente.Start();

ServRodando = true;

thrListener = new Thread(MantemAtendimento);

thrListener.Start();

}

catch (Exception ex)

{

throw ex;

}

}

 

private void MantemAtendimento()

{

while (ServRodando == true)

{

tcpCliente = tlsCliente.AcceptTcpClient();

Conexao newConnection = new Conexao(tcpCliente);

}

}

{/code}

 

 

  • Feito isso, antes da ultima chave ( } ), digite o seguinte comando:

 

{code}

class Conexao

{

TcpClient tcpCliente;

private Thread thrSender;

private StreamReader srReceptor;

private StreamWriter swEnviador;

private string usuarioAtual;

private string strResposta;

public Conexao(TcpClient tcpCon)

{

tcpCliente = tcpCon;

thrSender = new Thread(AceitaCliente);

thrSender.Start();

}

private void FechaConexao()

{

tcpCliente.Close();

srReceptor.Close();

swEnviador.Close();

}

private void AceitaCliente()

{

srReceptor = new System.IO.StreamReader(tcpCliente.GetStream());

swEnviador = new System.IO.StreamWriter(tcpCliente.GetStream());

usuarioAtual = srReceptor.ReadLine();

if (usuarioAtual != "")

{

if (ChatServidor.htUsuarios.Contains(usuarioAtual) == true)

{

swEnviador.WriteLine("0|Este nome de usuário já existe.");

swEnviador.Flush();

FechaConexao();

return;

}

else if (usuarioAtual == "Administrator")

{

swEnviador.WriteLine("0|Este nome de usuário é reservado.");

swEnviador.Flush();

FechaConexao();

return;

}

else

{

swEnviador.WriteLine("1");

swEnviador.Flush();

ChatServidor.IncluiUsuario(tcpCliente, usuarioAtual);

}

}

else

{

FechaConexao();

return;

}

try

{

while ((strResposta = srReceptor.ReadLine()) != "")

{

if (strResposta == null)

{

ChatServidor.RemoveUsuario(tcpCliente);

}

else

{

ChatServidor.EnviaMensagem(usuarioAtual, strResposta);

}

}

}

catch

{

ChatServidor.RemoveUsuario(tcpCliente);

}

}

}

{/code}

 

  • Pronto, basta somente compilar para ver se o código está certo, caso não funcione, revise todo o seu código.

 

 

 

 

 

 

Programa Baseado pelo site http://www.macoratti.net/11/08/c_chat2.htm