終於忍受不了每次都佈置《XX管理系統》這樣的東西了,同窗們,讓咱們玩點傳統的。民意結果出來了,題目分別是:像飛鴿傳書那樣的即時通信工具、影音播放器、系統維護工具、後門***、俄羅斯方塊遊戲、淘寶那樣的網站。後悔了,頭大了。沒辦法,只好再次回到N年前,當我還年青的時候,誰能想到還有今天的色戒……
飛鴿傳書的源代碼我曾經拜讀過,說實話,沒有讀明白。而今,咱們用最簡單的辦法實現吧。那就是把偵聽和發送都放到同一端,也就是即不斷偵聽,又能夠發送出去數據。
要使用 UDP 發送數據文報,必須知道承載所需服務的網絡設備的網絡地址以及該服務用於通訊的 UDP 端口號。
下面這段代碼演示了監聽演示:
public void StartListenerConsoleDemo()
{
bool done = false;
UdpClient listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
try
{
while (!done)
{
Console.WriteLine("Waiting for broadcast");
byte[] bytes = listener.Receive(ref groupEP);//注意在這裏線程會掛起
Console.WriteLine("Received broadcast from {0} :\n {1}\n",
groupEP.ToString(),
Encoding.UTF8.GetString(bytes, 0, bytes.Length));
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
listener.Close();
}
}
其中listenPort表示監聽端口號,如下雷同。發送代碼演示以下,注意爲了兼容漢字,最好用UTF8代碼:
public void Send(string toIP,string message)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress broadcast = IPAddress.Parse(toIP);
byte[] sendbuf = Encoding.UTF8.GetBytes(message);
IPEndPoint ep = new IPEndPoint(broadcast, listenPort);
s.SendTo(sendbuf, ep);
}
既然監聽和發送模塊都有了,剩下的就是組合了。監聽功能固然要時刻監聽,這就是爲何耳朵不能關閉,而眼睛能夠。分給它一個線程,不間斷監聽。OK了。
可是在退出程序時,用Thread的join方法卻結束不了線程,固然是由於監聽線程在Receive地方掛住了,因此能夠給本身發個空數據Send("127.0.0.1", "")來結束
(完)