天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

實現基于事件通知的.Net套接字

  以前學過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,這樣應該就比較完整了,只可惜我不知道怎么做^_^,如果誰知道的話歡迎指教。

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

  如果有問題請聯系 [email protected]

AspNet技術實現基于事件通知的.Net套接字,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 熟女人妻AV五十路六十路 | 日韩无码在线 | 毛片无码免费无码播放 | 超碰在线观看 | 久久国产免费观看精品1 | 又黄又粗又爽免费观看 | 妹妹的第一次有点紧 | 国产99九九久久无码熟妇 | 高清国产在线观看 | 快播性爱电影 | 99久久精品久久久 | 131美女爱做视频午夜剧场 | 国产福利一区二区精品 | 欧美动物交ideos | 国产一区在线观看免费 | 又黄又猛又爽大片免费 | 男生J桶进女人P又色又爽又黄 | 99热久久这里只精品国产WWW | WWW国产精品内射熟女 | 美女挑战50厘米长的黑人 | FREE性丰满白嫩白嫩的HD | 噼里啪啦免费观看视频大全 | 国产偷国产偷亚洲高清人乐享 | 窝窝色资源站 | 无码日韩人妻精品久久蜜桃免费 | 国产在线亚洲精品观看不卡 | 亚洲毛片网 | 青柠在线电影高清免费观看 | 国产 高清 无码 在线播放 | 嫩草影院久久精品 | 闺蜜撬开我的腿用黄瓜折磨我 | 久久久无码精品一区二区三区 | 亚洲免费在线视频观看 | 灌饱娇嫩H将军公主最新章节 | 18 japanese宾馆直播 | 免费乱理伦片在线观看八戒 | 丝袜情趣在线资源二区 | yellow片高清视频免费看 | 国产精品成人A蜜柚在线观看 | 92午夜免费福利757 | 日本漫画之无彩翼漫画 |