2016-06-03 14 views
0

Ich mache gerade einen Chat, der eine direkte UDP-Verbindung ist. Ich sah viele Vorschläge für TCP-Chat und einen dritten Computer (Server), aber das wollte ich nicht. Der Chat sollte nur lokal funktionieren, wie ich getestet habe und an großen Orten wie Schule, Arbeit oder anderen großartig sind.Empfange UDP-Daten von einem bestimmten Port, der an die richtextbox ausgegeben wird, während der Text c bleibt. C#

Bis jetzt habe ich es bekommen, UDP-Paket zu senden, wenn Sie Return in Textfeld, aber die Person, die ich es sende, naht nicht, um es in das Programm zu bekommen. Ich benutze Wireshark, um zu überprüfen, ob es wirklich zu ihm geht, und es tut es. Ich habe mehrere Google-Suchen und Tests versucht, aber nur Nähte, um Fehler zu bekommen, oder bekomme nichts zum Programm.

Was ich will, ist ein Übersetzer, der das UDP-Paket von bestimmten Port empfängt, und zeigt nur die Textdaten aus dem Paket. Ich möchte, dass es auf einem richTextBox2 Plus angezeigt wird, was bereits vorhanden ist.

Hier ist der Code, und ein paar Screenshots:

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) 
    { 

    } 
    } 
} 

screenshots:

computer1 program

computer2 Wireshark -test

ich vor kurzem von Visual Basic C# sprang haben, und ich Ich bin irgendwie neu, um Sachen zu vernetzen. Vielen Dank, wenn Sie bereit sind zu helfen :)

+0

Sie schließen sofort Buchse nach Daten becuase die Buchse in der Methode KeyDown gesendet wird deklariert wird. Keine gute Idee, denn der Socket könnte schließen, bevor die Daten tatsächlich empfangen werden. Der Socket wird entsorgt, wenn Sie von der KeyDown-Methode zurückkehren. – jdweng

+0

Nun, Wireshark zeigt alles, und es gibt kein Problem, es zu senden, was auch immer – KrisPus

+0

Wann tritt der Abschluss auf? Es sei denn, Sie sehen, dass die Nachricht tatsächlich empfangen wird, bedeutet nicht, dass die Nachricht tatsächlich an den Empfänger gelangt ist. Das Schließen kann tatsächlich vor der letzten Nachricht an den Empfänger gelangen. – jdweng

Antwort

0

Haben es funktioniert.

hier ist der Code so weit, und es funktioniert!

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

    } 
} 

Falls Sie etwas simular machten, dieser Code funktioniert nur auf lokalen Internet

+0

Dieser Code funktioniert über das Internet, sofern die IP-Adresse erreicht werden kann. In diesem Code gibt es keine Einschränkungen, die nur auf ein lokales Internet beschränkt sind. – jdweng

+0

Ich weiß, und dieser Code ist für große Gebäude wie Schule, Arbeit oder andere große Orte gedacht. Wenn ich das über die ganze Welt ausdehnen würde, würde ich vermutlich mit diesem Code ither, port forward oder etwas Verrücktes machen – KrisPus