天天看點

區域網路通訊工具——網絡程式設計

終于忍受不了每次都布置《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", "")來結束

(完)

本文轉自 王傑瑞 51CTO部落格,原文連結:http://blog.51cto.com/wangjierui/55877,如需轉載請自行聯系原作者