• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        完成基于事件通知的.Net套接字

        完成基于事件通知的.Net套接字

        更新時間:2022-05-04 文章作者:未知 信息來源:網絡 閱讀次數:

        以前學過MFC,我用過的它里面的包裝Winsock的兩個類CSocket和CAsyncSocket,我一直覺得它哪個事件通知的功能比較不錯,特別是在連接的兩方收發數據沒有一定的規律的時候比較有用,雖然不用它的事件通知也可以實現功能,但是你需要循環檢測套接字的狀態或者阻塞等待,如果每次都要做這些瑣碎的工作豈不是很麻煩,于是我就想對這些功能作一次封裝。當然在.net里面采用delegate和event是最好的選擇了。下面就是我實現的一些細節:

        先講一下思路:其實這個還是很簡單了,估計高手們會不屑一顧了^_^。當套接字開始工作,比如開始監聽、開始連接的時候,啟動一個線程不停的檢測套接字的狀態,當某一事件的狀態條件滿足時就觸發此事件,要知道具體檢測套接字狀態的方法,請往下看。

        平常用套接字編成的時候可能需要用到的功能就是:連接成功或者失敗的通知、在監聽的套接字上有掛起的連接的通知、有數據可以接受的通知、套接字關閉的通知、還有套接字空閑可以發送數據的通知等,我也就使對上面幾個功能作了封裝,不過我覺得最后面一個功能用處不大???

        我的Socket類是從System.Net.Sockets.Socket繼承下來的,類名TcpEventSocket,實現如下:

        先申明事件的委托類型,具體看代碼

        public delegate void AcceptConnectionHandler();

        public delegate void ConnectCompletedHandler(bool connected); //connected表明連接成功與否

        public delegate void DataCanSendHandler();

        public delegate void DataCanReceiveHandler(int buffersize); //當前可以接受的數據量

        public delegate void SocketClosedHandler();

        這些類型具體什么意思應該能看出來吧,另外還要申明對應的事件

        public event AcceptConnectionHandler AcceptConnection;

        public event ConnectCompletedHandler ConnectCompleted;

        public event DataCanSendHandler DataCanSend;

        public event DataCanReceiveHandler DataCanReceive;

        public event SocketClosedHandler SocketClosed;

        另外加了幾個虛方法,這幾個方法用來觸發事件

        protected virtual void OnAcceptConnection();
        protected virtual void OnConnectCompleted(bool connected)

        protected virtual void OnDataCanSend()
        protected virtual void OnDataCanReceive(int buffersize)

        protected virtual void OnSocketClosed()

        為了在適當的事機啟動檢測線程,我重寫了幾個基類的方法:

        new public void Listen(int backlog)

        {

        base.Listen(backlog);

        sockState = SocketState.Listenning;

        if (!checkThread.IsAlive)

        checkThread.Start();

        }

        new public void Connect(EndPoint remoteEP)

        {

        try

        {

        base.Connect(remoteEP);

        this.Blocking = false; //設置非阻塞狀態,以便事件通知的效率

        if (!checkThread.IsAlive)

        checkThread.Start();

        }

        catch(SocketException)

        {

        OnConnectCompleted(false);

        }

        }

        這兩個方法實際編成中都應該首先被調用的,所以有他們啟動檢測線程比較合適,另外線程啟動了必然也要中止,于是我重寫了Close方法

        new public void Close()

        {

        if(checkThread.IsAlive) //先中止線程再關閉連接

        checkThread.Abort();

        base.Close();

        sockState = SocketState.Disconnected;

        OnSocketClosed();

        }

        于是剩下的工作就是怎么檢測套接字了,Socket類有個Select的靜態方法,它可以檢測很多套接字的狀態,不過這里只需要檢測一個,所以直接用Socket的Poll方法,Poll的具體用法可以看MSDN,我這里用代碼說明我對套接字的檢測方法

        while(true) //循環檢查

        {

        if (sockState == SocketState.Disconnected) //如果當前沒有連接

        {

        if (Poll(500, SelectMode.SelectWrite))

        OnConnectCompleted(true); //如果為可寫狀態,則表示連接成功

        }

        else if(sockState == SocketState.Listenning)

        {

        if (Poll(500, SelectMode.SelectRead)) //如果在監聽狀態發現套接字有數據可讀則表示已經有人連接上來可以調用Accept接受連接

        OnAcceptConnection();

        }

        else //這里sockState = SocketState.Connected

        {

        if (Poll(500, SelectMode.SelectWrite)) //如果有可寫狀態則表示可以發送數據

        OnDataCanSend();

        if (Poll(500, SelectMode.SelectRead)) //如果有可讀狀態

        {

        if (Available > 0) //如果有數據可讀表示可以調用Receive接受數據

        OnDataCanReceive(Available);

        else

        {

        OnSocketClosed(); //沒數據可讀表示連接已經關閉

        break;

        }

        }

        }

        //如果沒有連接并且有錯誤狀態,則連接失敗

        if (sockState == SocketState.Disconnected && Poll(500, SelectMode.SelectError))

        OnConnectCompleted(false);

        }

        這里的OnXXX方法就是執行事件通知的方法,并且派生類中可以重載這些方法直接獲得事件通知而不需要掛界別的事件通知處理函數(類似于MFC的OnAccept等虛函數)。不過派生的函數集的調用基類的相應方法哦。很可惜沒有重寫Socket.Accept方法,讓它返回一個TcpEventSocket,這樣應該就比較完整了,只可惜我不知道怎么做^_^,如果誰知道的話歡迎指教。

        事件通知機制已經基本完成,所缺乏的只是大量的測試(我做了幾下最簡單的測試,慚愧!!^_^)

        如果有問題請聯系 yzx110@bit.e

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 成人激情免费视频| a毛片免费在线观看| 亚洲综合在线一区二区三区| 亚洲国产日韩视频观看| 国产精品美女免费视频观看| 午夜视频免费在线观看| 成人免费在线视频| 亚洲一卡一卡二新区无人区| 免费观看理论片毛片| 亚洲熟妇无码另类久久久| 亚洲成人黄色网址| 一级午夜免费视频| 国产男女爽爽爽爽爽免费视频| 免费观看亚洲人成网站| 亚洲精品视频久久| 9i9精品国产免费久久| 日本一道高清不卡免费| 亚洲欧洲日产国产最新| 成人免费a级毛片无码网站入口| 国产99视频精品免费视频7| 国产亚洲福利精品一区二区| 亚洲免费在线视频播放| 亚洲AV综合色区无码另类小说| 亚洲风情亚Aⅴ在线发布| 猫咪免费人成网站在线观看| 美腿丝袜亚洲综合| 国产成人精品亚洲| 亚洲精品乱码久久久久久按摩| 成年大片免费高清在线看黄| 精品久久久久久久免费人妻| 青青久久精品国产免费看| 国产男女猛烈无遮挡免费网站| 亚洲中文字幕久在线| 最近2019免费中文字幕6| 久久精品九九亚洲精品天堂| 人与动性xxxxx免费| 久久亚洲精品无码aⅴ大香| baoyu122.永久免费视频| 亚洲一区中文字幕在线观看| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲人成综合网站7777香蕉|