国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

實(shí)現(xiàn)基于事件通知的.Net套接字

2024-07-10 12:40:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  以前學(xué)過(guò)MFC,我用過(guò)的它里面的包裝Winsock的兩個(gè)類CSocket和CAsyncSocket,我一直覺(jué)得它哪個(gè)事件通知的功能比較不錯(cuò),特別是在連接的兩方收發(fā)數(shù)據(jù)沒(méi)有一定的規(guī)律的時(shí)候比較有用,雖然不用它的事件通知也可以實(shí)現(xiàn)功能,但是你需要循環(huán)檢測(cè)套接字的狀態(tài)或者阻塞等待,如果每次都要做這些瑣碎的工作豈不是很麻煩,于是我就想對(duì)這些功能作一次封裝。當(dāng)然在.net里面采用delegate和event是最好的選擇了。下面就是我實(shí)現(xiàn)的一些細(xì)節(jié):

  先講一下思路:其實(shí)這個(gè)還是很簡(jiǎn)單了,估計(jì)高手們會(huì)不屑一顧了^_^。當(dāng)套接字開(kāi)始工作,比如開(kāi)始監(jiān)聽(tīng)、開(kāi)始連接的時(shí)候,啟動(dòng)一個(gè)線程不停的檢測(cè)套接字的狀態(tài),當(dāng)某一事件的狀態(tài)條件滿足時(shí)就觸發(fā)此事件,要知道具體檢測(cè)套接字狀態(tài)的方法,請(qǐng)往下看。

  平常用套接字編成的時(shí)候可能需要用到的功能就是:連接成功或者失敗的通知、在監(jiān)聽(tīng)的套接字上有掛起的連接的通知、有數(shù)據(jù)可以接受的通知、套接字關(guān)閉的通知、還有套接字空閑可以發(fā)送數(shù)據(jù)的通知等,我也就使對(duì)上面幾個(gè)功能作了封裝,不過(guò)我覺(jué)得最后面一個(gè)功能用處不大???

  我的Socket類是從System.Net.Sockets.Socket繼承下來(lái)的,類名TcpEventSocket,實(shí)現(xiàn)如下:

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

  public delegate void AcceptConnectionHandler();

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

  public delegate void DataCanSendHandler();

  public delegate void DataCanReceiveHandler(int buffersize); //當(dāng)前可以接受的數(shù)據(jù)量

  public delegate void SocketClosedHandler();

  這些類型具體什么意思應(yīng)該能看出來(lái)吧,另外還要申明對(duì)應(yīng)的事件

  public event AcceptConnectionHandler AcceptConnection;

  public event ConnectCompletedHandler ConnectCompleted;

  public event DataCanSendHandler DataCanSend;

  public event DataCanReceiveHandler DataCanReceive;

  public event SocketClosedHandler SocketClosed;

  另外加了幾個(gè)虛方法,這幾個(gè)方法用來(lái)觸發(fā)事件

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

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

  protected virtual void OnSocketClosed()

  為了在適當(dāng)?shù)氖聶C(jī)啟動(dòng)檢測(cè)線程,我重寫(xiě)了幾個(gè)基類的方法:

  new public void Listen(int backlog)

  {

  base.Listen(backlog);

  sockState = SocketState.Listenning;
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇远县| 游戏| 夏津县| 汝南县| 苏尼特左旗| 湖州市| 洪雅县| 汤阴县| 阳高县| 两当县| 奉新县| 苗栗县| 开封市| 定结县| 邳州市| 朔州市| 芷江| 新河县| 昆山市| 西乌珠穆沁旗| 加查县| 沂水县| 延长县| 台前县| 奉化市| 勐海县| 沙洋县| 望都县| 焦作市| 奉新县| 阿坝县| 河西区| 临海市| 宁明县| 台北市| 大新县| 章丘市| 乐都县| 钟山县| 铜川市| 同江市|