none
Chat em C# assincrono RRS feed

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


                   
    domingo, 10 de novembro de 2013 22:34

Respostas

  • Olá

    Da uma olhada nesse artigo da Code Project que é perfeitamente o que precisa.

    LanTalk
    http://www.codeproject.com/Articles/26746/LanTalk


    Atenciosamente,
    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
    segunda-feira, 11 de novembro de 2013 14:13