2012-04-09 6 views
2

Wenn ich versuche, eine Nachricht von meinem Client zu senden, kann der Server diese Nachricht nicht empfangen und nicht drucken. Kann mir jemand den Fehler in der folgenden Server-Client-Anwendung sagen.UDP-Datagramm-Code für Server-Clientanwendung in C#

Ich habe zwei WinForm-Projekte erstellt, eines ist UDP-Server und das andere ist UDP-Client.

Im UDP-Server-Projekt habe ich ein Formular erstellt, das eine RichTextBox mit dem Namen richTextBox1 zum Anzeigen von Nachrichten und eine Schaltfläche mit dem Namen btStart zum Starten/Stoppen des Listening enthält. Dies ist der Code-Schnipsel:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

namespace UDPServer 
{ 
public partial class Form1 : Form 
{ 
    delegate void ShowMessageMethod(string msg); 

    UdpClient _server = null; 
    IPEndPoint _client = null; 
    Thread _listenThread = null; 
    private bool _isServerStarted = false; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void serverMsgBox_Load(object sender, EventArgs e) 
    { 
     this.btStart.Text = "StartServer"; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void btStart_Click(object sender, EventArgs e) 
    { 
     if (_isServerStarted) 
     { 
      Stop(); 
      btStart.Text = "StartServer"; 
     } 
     else 
     { 
      Start(); 
      btStart.Text = "StopServer"; 
     } 

    } 
    private void Start() 
    { 
     //Create the server. 
     IPEndPoint serverEnd = new IPEndPoint(IPAddress.Any, 1234); 
     _server = new UdpClient(serverEnd); 
     ShowMsg("Waiting for a client..."); 
     //Create the client end. 
     _client = new IPEndPoint(IPAddress.Any, 0); 

     //Start listening. 
     Thread listenThread = new Thread(new ThreadStart(Listening)); 
     listenThread.Start(); 
     //Change state to indicate the server starts. 
     _isServerStarted = true; 
    } 

    private void Stop() 
    { 
     try 
     { 
      //Stop listening. 
      listenThread.Join(); 
      ShowMsg("Server stops."); 
      _server.Close(); 
      //Changet state to indicate the server stops. 
      _isServerStarted = false; 
     } 
     catch (Exception excp) 
     { } 
    } 

    private void Listening() 
    { 
     byte[] data; 
     //Listening loop. 
     while (true) 
     { 
      //receieve a message form a client. 
      data = _server.Receive(ref _client); 
      string receivedMsg = Encoding.ASCII.GetString(data, 0, data.Length); 
      //Show the message. 
      this.Invoke(new ShowMessageMethod(ShowMsg), new object[] { "Client:" + receivedMsg }); 
      //Send a response message. 
      data = Encoding.ASCII.GetBytes("Server:" + receivedMsg); 
      _server.Send(data, data.Length, _client); 
      //Sleep for UI to work. 
      Thread.Sleep(500); 
     } 
    } 
    private void ShowMsg(string msg) 
    { 
     this.richTextBox1.Text += msg + "\r\n"; 
    } 
} 
} 

In UDP-Client-Projekt, habe ich auch eine Form, die ein RichTextBox namens RichTextBox1 zur Eingabe oder Show-Nachricht und eine Schaltfläche namens enthält btSend die Eingangsnachricht zu senden. Sie können mehrere Instanzen dieses Projekts ausführen. Der Server würde mit allen laufenden Clients zurechtkommen. Dies ist das Code-Snippet:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 

namespace UDPClient 
{ 
public partial class Form1 : Form 
{ 
    UdpClient _server = null; 
    IPEndPoint _client = null; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 



    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
    private void serverMsgBox_Load(object sender, EventArgs e) 
    { 
     //Get the server. 
     _server = new UdpClient("127.0.0.1", 16000); 
     //Create a client. 
     _client = new IPEndPoint(IPAddress.Any, 0); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     try 
     { 
      _server.Close(); 
     } 
     catch (Exception s) 
     { 
     } 
    } 

    private void btSend_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //Send the input message. 
      string text = this.richTextBox1.Text; 
      _server.Send(Encoding.ASCII.GetBytes(text), text.Length); 
      //Receive the response message. 
      byte[] data = _server.Receive(ref _client); 
      string msg = Encoding.ASCII.GetString(data, 0, data.Length); 
      //Show the response message. 
      this.richTextBox1.Text = msg; 
     } 
     catch (Exception exp) 
     { 

     } 
    } 

} 
} 

Antwort