2016-06-03 5 views
0

В настоящее время я делаю чат, который является прямым соединением UDP. Я видел много предложений TCP-чата и третьего компьютера (сервера), но я этого не хотел. Чат должен работать только на месте, так как я тестировал и отлично разбираюсь в таких больших местах, как школа, работа или другие.Получать данные UDP с определенного порта, выводимого в richtextbox, сохраняя текст C#

До сих пор я получил его для отправки UDP-пакета при попадании Return в текстовое поле, но человек, которого я отправляю, не является швом, чтобы получить его в программу. Я использую Wireshark, чтобы проверить, действительно ли он подходит к нему, и это так. Я пробовал несколько поисков и тестов Google, но только шов, чтобы получить ошибки, или ничего не получал от программы.

Что я хочу, это переводчик, который получает UDP-пакет с определенного порта и отображает только текстовые данные из пакета. Я хочу, чтобы он отображался в richTextBox2, поддерживая то, что уже есть.

Вот код, и несколько скриншотов:

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; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Threading; 

namespace chat 
{ 
    public partial class Form1 : Form 
    { 



    public Form1() 
    { 

     InitializeComponent(); 
     // set this.FormBorderStyle to None here if needed 
     // if set to none, make sure you have a way to close the form! 
    } 


    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_NCHITTEST) 
      m.Result = (IntPtr)(HT_CAPTION); 
    } 

    private const int WM_NCHITTEST = 0x84; 
    private const int HT_CLIENT = 0x1; 
    private const int HT_CAPTION = 0x2; 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     colorDialog1.ShowDialog(); 
     pictureBox1.BackColor = colorDialog1.Color; 
     this.BackColor = colorDialog1.Color; 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

    } 

    private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
     { 
      { 
       Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 
    ProtocolType.Udp); 

       string IpAddress = textBox3.Text; 
       IPAddress serverAddr = IPAddress.Parse(IpAddress); 


       IPEndPoint endPoint = new IPEndPoint(serverAddr, 2522); 

       string text = textBox4.Text + ": " + richTextBox1.Text; 
       byte[] send_buffer = Encoding.ASCII.GetBytes(text); 

       sock.SendTo(send_buffer, endPoint); 

       richTextBox2.Text = richTextBox2.Text + Environment.NewLine + textBox4.Text + ": " + richTextBox1.Text; 

       richTextBox1.Text = ""; 
      } 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
    } 
} 

скриншоты:

computer1 program

computer2 Wireshark -test

Я недавно спрыгнул с Visual Basic на C#, и я m вид нового для сетевого материала. Большое спасибо, если вы готовы помочь :)

+0

Вы экипировку близко сразу после того, как данные пересылаются becuase сокет объявлен в методе KeyDown. Не очень хорошая идея, потому что сокет может закрыться до фактического получения данных. сокет будет удален, когда вы вернетесь из метода KeyDown. – jdweng

+0

хорошо, Wireshark показывает все это, и нет никаких проблем с отправкой, что так всегда – KrisPus

+0

Когда происходит закрытие? Если вы не видите, что сообщение действительно получено, это не означает, что сообщение действительно досталось получателю. Закрытие фактически может добраться до получателя до последнего сообщения. – jdweng

ответ

0

Получил это работу.

вот код, и он работает!

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; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Threading; 
using System.Net.NetworkInformation; 

namespace chat 
{ 
    public partial class Form1 : Form 

    { 



    private const int MyPort = 2522; 
    private UdpClient Client; 

    public Form1() 
    { 
     InitializeComponent(); 

     // Create the UdpClient and start listening. 
     Client = new UdpClient(MyPort); 
     Client.BeginReceive(DataReceived, null); 
    } 

    private void DataReceived(IAsyncResult ar) 
    { 
     IPEndPoint ip = new IPEndPoint(IPAddress.Any, MyPort); 
     byte[] data; 
     try 
     { 
      data = Client.EndReceive(ar, ref ip); 

      if (data.Length == 0) 
       return; // No more to receive 
      Client.BeginReceive(DataReceived, null); 
     } 
     catch (ObjectDisposedException) 
     { 
      return; // Connection closed 
     } 

     // Send the data to the UI thread 
     this.BeginInvoke((Action<IPEndPoint, string>)DataReceivedUI, ip, Encoding.UTF8.GetString(data)); 
    } 

    private void DataReceivedUI(IPEndPoint endPoint, string data) 
    { 
     richTextBox2.AppendText(data + Environment.NewLine); 
     label4.Text = ("[" + endPoint.ToString() + "]"); 
     //richTextBox2.AppendText("[" + endPoint.ToString() + "] " + data + Environment.NewLine); 
    } 



    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_NCHITTEST) 
      m.Result = (IntPtr)(HT_CAPTION); 
    } 

    private const int WM_NCHITTEST = 0x84; 
    private const int HT_CLIENT = 0x1; 
    private const int HT_CAPTION = 0x2; 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     colorDialog1.ShowDialog(); 
     pictureBox1.BackColor = colorDialog1.Color; 
     this.BackColor = colorDialog1.Color; 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

    } 



    private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
     { 
      { 
       Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

       string IpAddress = textBox3.Text; 
       IPAddress serverAddr = IPAddress.Parse(IpAddress); 


       IPEndPoint endPoint = new IPEndPoint(serverAddr, 2522); 

       string text = textBox4.Text + ": " + richTextBox1.Text; 
       byte[] send_buffer = Encoding.ASCII.GetBytes(text); 

       sock.SendTo(send_buffer, endPoint); 

       richTextBox2.Text = richTextBox2.Text + textBox4.Text + ": " + richTextBox1.Text + Environment.NewLine; 

       richTextBox1.Text = ""; 
      } 
     } 
    } 



    private void Form1_Load(object sender, EventArgs e) 
    { 
     foreach (var addr in Dns.GetHostEntry(string.Empty).AddressList) 
     { 
      if (addr.AddressFamily == AddressFamily.InterNetwork) 
       label5.Text = "" + addr; 
     } 
    } 

    } 
} 

В случае, если вы делали что-то Двойники, этот код работает только местный Интернет на

+0

Этот код будет работать через Интернет при условии, что IP-адрес может быть достигнут. В этом коде нет ограничений, ограничивающих только локальный Интернет. – jdweng

+0

Я знаю, и этот код предназначен для больших зданий, таких как школа, работа или другие большие места. Если я буду распространять это по всему миру, я думаю, я бы сделал это, переместился вперед или сделал что-то сумасшедшее с помощью этого кода – KrisPus