2012-04-09 25 views
2

當我嘗試從我的客戶端發送消息時,服務器無法接收該消息並將其打印出來。任何人都可以告訴我以下服務器客戶端應用程序中的錯誤。C#中服務器客戶端應用程序的UDP數據報代碼

我創建了兩個WinForm項目,一個是UDP服務器,另一個是UDP客戶端。

在UDP服務器項目中,我創建了一個表單,其中包含名爲richTextBox1的RichTextBox以顯示消息,以及名爲btStart的Button以啓動/停止偵聽。這是代碼片段:

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

在UDP客戶端項目中,我也創建了包含一個名爲richTextBox1輸入或顯示消息和一個名爲與BTSend發送輸入的消息按鈕RichTextBox的一種形式。您可以運行該項目的多個實例。服務器將應付所有正在運行的客戶端。這是代碼片段:

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

     } 
    } 

} 
} 

回答