下面通過一個例子,對UdpClIEnt類的用法及它的一些方法進行說明。在UDP模式下,不存在明顯的服務器與客戶端之分,所以在這裡用A端和B端代替。本例要實現的功能是從A端到B端的點對點通信。打開VS2008,在D:C#ch17目錄下建立名為P2PTest的Windows應用程序。打開工程,為當前窗體添加如表17-9所示控件。
表17-9 添加控件列表
控件名 Name Text Label Label1 對方IP: TextBox tbIP TextBox tbMsg Button btnSend 發送 ListBox lbInfo GroupBox gbSend 發送窗口 GroupBox gbReceive 接收窗口 Button btnClear 清空本例是利用8888端口進行局域網內部的點對點通信,只要確認對方IP,就能相互發送信息。代碼的添加主要分為以下步驟。
(1)首先是對幾個命名空間的引用,包括System.Net、System.Net.Sockets和System.Threading。然後定義如下三個全局變量。
private UdpClIEnt uc;
private IPEndPoint IEp;
private Thread th;
其中UdpClIEnt是本例的核心成員,主要通過它的相關方法進行數據的收發。
(2)本例使用8888端口進行通信,所以應該在當前窗體構造函數Form1()內,用該端口實例化UdpClIEnt。
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
uc = new UdpClIEnt(8888);
}
CheckForIllegalCrossThreadCalls主要是解決線程間的控件操作問題,通過將其屬性設置為fasle,可以禁用對操作控件的線程是否為創建該窗體的線程的檢測,阻止該異常的發生。這種問題在第16章中也遇到過,當時是采用的委托的方法進行解決。
(3)雙擊“發送”按鈕,添加如下代碼。
IEp = new IPEndPoint(IPAddress.Parse(tbIP.Text), 8888);
th = new Thread(new ThreadStart(listen));
th.IsBackground = true; //設置在後台運行
th.Start(); //啟動線程
string temp = tbMsg.Text;
byte[] b = Encoding.UTF8.GetBytes(temp); //對發送的數據的進行UTF8格式的編碼
uc.Send(b, b.Length,IEp); //發送數據