Seu Curso

  • Full Screen
  • Wide Screen
  • Narrow Screen
  • Increase font size
  • Default font size
  • Decrease font size

Criando um Chat em C# (parte2)

Imprimir
Avaliação do Usuário: / 13
PiorMelhor 

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:


Using System.Net;

 

 

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

 

private delegate void AtualizaStatusCallback(string strMensagem);

 

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

 

 
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");


  • Feito isso, digite o seguinte comando:

 

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");
}

 

  • 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:

 

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

 

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


public class StatusChangedEventArgs : EventArgs
{
private string EventMsg;
public string EventMessage
{
get { return EventMsg; }
set { EventMsg = value; }
}
public StatusChangedEventArgs(string strEventMsg)
{
EventMsg = strEventMsg;
}
}
 


  • Feito isso digite o seguinte comando:

 

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

 

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

 

 
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);
}
}

 

 

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

 

 
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);
}
}
}

 

  • 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

Comentários  

 
0 #1 erro no mainServer_Stat usChangedmateushff 01-10-2016 15:33
se deu erro no
mainServer_Stat usChanged
só mudar para
mainServidor_St atusChanged
Citar
 

Adicionar comentário


Código de segurança
Atualizar

You are here: