一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

  以前學(xué)過MFC,我用過的它里面的包裝Winsock的兩個(gè)類CSocket和CAsyncSocket,我一直覺得它哪個(gè)事件通知的功能比較不錯(cuò),特別是在連接的兩方收發(fā)數(shù)據(jù)沒有一定的規(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)套接字開始工作,比如開始監(jiān)聽、開始連接的時(shí)候,啟動(dòng)一個(gè)線程不停的檢測(cè)套接字的狀態(tài),當(dāng)某一事件的狀態(tài)條件滿足時(shí)就觸發(fā)此事件,要知道具體檢測(cè)套接字狀態(tài)的方法,請(qǐng)往下看。

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

  我的Socket類是從System.NET.Sockets.Socket繼承下來的,類名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)該能看出來吧,另外還要申明對(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è)方法用來觸發(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è)線程,我重寫了幾個(gè)基類的方法:

  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; //設(shè)置非阻塞狀態(tài),以便事件通知的效率

  if (!checkThread.IsAlive)

  checkThread.Start();

  }

  catch(SocketException)

  {

  OnConnectCompleted(false);

  }

  }

  這兩個(gè)方法實(shí)際編成中都應(yīng)該首先被調(diào)用的,所以有他們啟動(dòng)檢測(cè)線程比較合適,另外線程啟動(dòng)了必然也要中止,于是我重寫了Close方法

  new public void Close()

  {

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

  checkThread.Abort();

  base.Close();

  sockState = SocketState.Disconnected;

  OnSocketClosed();

  }

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

  while(true) //循環(huán)檢查

  {

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

  {

  if (Poll(500, SelectMode.SelectWrite))

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

  }

  else if(sockState == SocketState.Listenning)

  {

  if (Poll(500, SelectMode.SelectRead)) //如果在監(jiān)聽狀態(tài)發(fā)現(xiàn)套接字有數(shù)據(jù)可讀則表示已經(jīng)有人連接上來可以調(diào)用Accept接受連接

  OnAcceptConnection();

  }

  else //這里sockState = SocketState.Connected

  {

  if (Poll(500, SelectMode.SelectWrite)) //如果有可寫狀態(tài)則表示可以發(fā)送數(shù)據(jù)

  OnDataCanSend();

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

  {

  if (Available > 0) //如果有數(shù)據(jù)可讀表示可以調(diào)用Receive接受數(shù)據(jù)

  OnDataCanReceive(Available);

  else

  {

  OnSocketClosed(); //沒數(shù)據(jù)可讀表示連接已經(jīng)關(guān)閉

  break;

  }

  }

  }

  //如果沒有連接并且有錯(cuò)誤狀態(tài),則連接失敗

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

  OnConnectCompleted(false);

  }

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

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

  如果有問題請(qǐng)聯(lián)系 yzx110@bit.edu.cn

AspNet技術(shù)實(shí)現(xiàn)基于事件通知的.Net套接字,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲欧美激情视频 | 国产精品网红女主播久久久 | 九九线精品视频 | 国产精品青草久久久久福利99 | 香蕉一区二区三区观 | 亚洲性小说 | 国产精品自在线观看剧情 | 久久久久久久综合 | 婷婷六月天激情 | 国产成人综合日韩精品婷婷九月 | 国产成人精品高清在线观看99 | 亚洲欧美激情综合第一区 | 亚洲第一黄色网址 | 精品成人资源在线观看 | 色综合久久加勒比高清88 | 免费播放美女一级毛片 | 国产精品午夜在线观看 | 成人午夜小视频 | 亚洲激情视频网站 | 亚洲最大色视频 | 一区二区精品在线观看 | 国产成人精品一区二三区 | 激情小说专区 | 精彩国产熟睡乱子伦午夜片 | 爱丝福利视频 | 久久精品99无色码中文字幕 | 日本视频一区二区 | 精品国产免费福利片 | 青青草国产精品人人爱99 | 狠狠夜色午夜久久综合热91 | www.天天色.com| 91精品国产免费入口 | 国内精品视频在线播放 | 国产精品专区第二 | 日韩美女毛片 | 久久精品国产乱子伦多人 | 国产一区视频在线免费观看 | 中文字幕日韩有码 | 久久九九综合 | 亚洲第一页在线观看 | 欧美人禽杂交狂配在线观看视频 |