Usuário com melhor resposta
Chat em C# assincrono

Pergunta
-
Boa noite,
estou fazendo um chat, em que apenas 2 usuarios irao conversar,ja fiz as modificações necessárias para que ele configure o ip e porta local automaticamente.mas estou com dificuldades para fazer uma maneira para que quando um dos usuarios apertar o botao "START" o programa fique em espera ate outro terminal apertar o botao start tambem, e quando outro terminal apertasse o start o terminal que ja apertou o start primeiro configure as informaçoes de ip do segundo terminal, e o segundo terminal pegar as informações de ip do terminal que ja apertou o botao start e estava aguardando.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //Blibiotecas necessárias para conexão using System.Net.Sockets; using System.Net; using System.IO; using System.Threading; namespace Chat { public partial class Form1 : Form { // variaveis utilizadas para comunicação Socket sckComunicacao; EndPoint epLocal, epRemoto; string apelido; // variável para receber informação byte[] buffer; // FAZ BUSCA DE IPS NA REDE!!!!!!!! TENTAR MANDAR UMA FLAG COM O BOTAAO STARRT DPS //Identificar o IP local private string IpLocal() { IPHostEntry host; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { return ip.ToString(); } } return "127.0.0.1"; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // configurar o socket Especifica IPv4 sckComunicacao = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sckComunicacao.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); } private void START_Click(object sender, EventArgs e) { string Ip; int PortaLocal; //Pega o IP local e define porta Ip = IpLocal(); PortaLocal = 6500; //vincular o socket epLocal = new IPEndPoint(IPAddress.Parse(Ip), PortaLocal); sckComunicacao.Bind(epLocal); int PortaExterna = 6501; string IpExterno = "127.0.0.1"; //Conecta com o IP e porta remoto epRemoto = new IPEndPoint(IPAddress.Parse(IpExterno), PortaExterna); sckComunicacao.Connect(epRemoto); //começa a ouvir de uma porta específica buffer = new byte[1464]; sckComunicacao.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemoto, new AsyncCallback(RecebeMensagem), buffer); // Habilita o botão Enviar button2.Enabled = true; } private void RecebeMensagem(IAsyncResult ar) { try { int tamanho = sckComunicacao.EndReceiveFrom(ar, ref epRemoto); // verifica se há algum envio de informação if (tamanho > 0) { // variável auxiliar para receber a informação byte[] aux = new byte[1464]; // armazena a informação aux = (byte[])ar.AsyncState; //converte para o tipo string System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); string msg = enc.GetString(aux); // disponibiliza a informação no listBox listBox1.Items.Add(apelido + ": " + msg); } // fica em modo de espera aguardando informações buffer = new byte[1464]; sckComunicacao.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemoto, new AsyncCallback(RecebeMensagem), buffer); } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void button2_Click(object sender, EventArgs e) { // converte de string para byte System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); byte[] msg = new byte[1464]; msg = enc.GetBytes(textBox2.Text); // envia a mensagem sckComunicacao.Send(msg); // exibe a mensagem no listBox listBox1.Items.Add(textBox1 + " diz: " + textBox2.Text); // limpa o campo de digitação de mensagens textBox2.Clear(); } private void button3_Click(object sender, EventArgs e) { bool apelidoDefinido = false; System.Text.ASCIIEncoding apelido1 = new System.Text.ASCIIEncoding(); byte[] apl = new byte[1464]; apl = apelido1.GetBytes(textBox1.Text); sckComunicacao.Send(apl); if (apelidoDefinido == false) { DefineApelido(); apelidoDefinido = true; } } private void DefineApelido() { throw new NotImplementedException(); } private void DefineApelido(IAsyncResult ar) { try { int tamanho = sckComunicacao.EndReceiveFrom(ar, ref epRemoto); // verifica se há algum envio de informação if (tamanho > 0) { // variável auxiliar para receber a informação byte[] aux = new byte[1464]; // armazena a informação aux = (byte[])ar.AsyncState; //converte para o tipo string System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); apelido = enc.GetString(aux); } // fica em modo de espera aguardando informações buffer = new byte[1464]; sckComunicacao.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemoto, new AsyncCallback(RecebeMensagem), buffer); } catch (Exception e) { MessageBox.Show(e.ToString()); } } } }
Respostas
-
Olá
Da uma olhada nesse artigo da Code Project que é perfeitamente o que precisa.
LanTalk
http://www.codeproject.com/Articles/26746/LanTalkAtenciosamente,
Raphael A. F. Cardoso
Blog: www.csharpbrasil.com.br
Twitter: @csharpbrasil / @ferronicardoso
“Se um dia você tiver que escolher entre o mundo e o amor, lembre-se: Se escolher o mundo ficará sem amor, mas se você escolher o amor, com ele conquistará o mundo” (Albert Einstein)- Sugerido como Resposta Raphael Heitor segunda-feira, 11 de novembro de 2013 14:14
- Marcado como Resposta Giovani Cr terça-feira, 19 de novembro de 2013 12:26