WinForm TCP異步鏈接之服務器端

TCP鏈接之服務器端,涉及到以下三個函數,分別是:html

複製代碼
/*****************************
  ** 函數功能:
     服務端監聽
  ** 輸入參數:    
  ** 輸出參數:
 ******************************/
 private void ServerListen(){}
複製代碼

 

複製代碼
/******************************
 ** 函數功能:
    用於與客戶端取得鏈接
 ** 輸入參數: 
 ** 輸出參數:
 ******************************/
 private void AcceptConnect(){}
複製代碼

 

複製代碼
/******************************
 ** 函數功能:
    接受客戶端發回的信息
 ** 輸入參數: 
     ar:客戶端發回的信息
 ** 輸出參數:
 ******************************/
 private void ReadCallback(IasyncResult ar){}
複製代碼

 

三者的關係圖以下:服務器

 

具體代碼以下:異步

一、ServerListen()async

private bool isExit = false;
 TcpListener listener;
  //用於線程同步,初始狀態設爲非終止狀態,使用手動重置方式
 private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);

  /******************************
   ** 做者: ***
   ** 變動時間: 2012-12-26
  ******************************/
  #region 服務端監聽方法
  private void ServerListen()
  {
      //因爲服務器要爲多個客戶服務,因此須要建立一個線程監聽客戶端鏈接請求
     ThreadStart ts = new ThreadStart(AcceptConnect);
      Thread myThread = new Thread(ts);
      myThread.Start();
  }
 #endregion

  

二、AcceptConnect()函數

/******************************
   ** 做者: ***
  ** 變動時間: 2012-12-26
 ******************************/
 #region 與客戶機取得鏈接
 private void AcceptConnect()
 {
      //獲取本機全部IP地址 
     IPAddress[] localips = Dns.GetHostAddresses(Dns.GetHostName());
    
      foreach (IPAddress ip in localips)
      {
          //找到本地全部IP地址符合IPV4協議的IP地址
        if (ip.AddressFamily == AddressFamily.InterNetwork)
          {
                IPAddress ip4;
                ip4 = ip;
                listener = new TcpListener(ip4, 5000);
                listener.Start();
                break;
           }
       }

       //引用在異步操做完成時調用的回調方法
     AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);

       while (isExit == false)
       {
           //將事件的狀態設爲非終止
         allDone.Reset();

           //開始一個異步操做接受傳入的鏈接嘗試
         listener.BeginAcceptTcpClient(callback, listener);

           //阻塞當前線程,直到收到客戶鏈接信號
         allDone.WaitOne();

            Thread.Sleep(100);
        }
 }
 #endregion

  

三、AcceptTcpClientCallback()post

/******************************
   ** 做者: ***
  ** 變動時間: 2012-12-26
 ******************************/
 #region 鏈接客戶端的回調函數
 //ar是IAsyncResult類型的接口,表示異步操做的狀態是由listener.BeginAcceptTcpClient(callback, listener)傳遞過來的
 
  private void AcceptTcpClientCallback(IAsyncResult ar)
  {
      //將事件狀態設爲終止狀態,容許一個或多個等待線程繼續
     allDone.Set();
      TcpListener myListener = (TcpListener)ar.AsyncState;

      //異步接收傳入的鏈接,並建立新的TcpClient對象處理遠程主機通訊
     TcpClient client = myListener.EndAcceptTcpClient(ar);
      ReadWriteObject readWriteObject = new ReadWriteObject(client);

      readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
   }
 #endregion

  

四、ReadCallback()url

byte[] tem = new byte[24];
  byte[] Msgbody;
  byte[] ErrorEndTime;
  ByteToObject bytetoobject = new ByteToObject();

  /******************************
   ** 做者: ***
   ** 變動時間: 2012-12-02
  ******************************/
  #region 接收客戶端發來的信息,ar爲異步方法下客戶端發回的信息
  private void ReadCallback(IAsyncResult ar)
  {
        ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
        int length = readWriteObject.netStream.EndRead(ar);
        tem = new byte[24];
        Array.Copy(readWriteObject.readBytes, 0, tem, 0, 24);

        //MsgHead爲自定義的結構體
        MsgHead msghead = (MsgHead)bytetoobject.BytesToStuct(tem, typeof(MsgHead));
       if (length > 0 && msghead.Sync == 0x4D)
       {
           switch (msghead.MsgType)
           {
                //根據收到的信息的頭部來執行下面的操做
           }
       }          
  }
相關文章
相關標籤/搜索