C# — WinForm TCP連接之服務器端


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

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

 

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

 

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

 

三者的關系圖如下:

 

具體代碼如下:

1、ServerListen()

View Code
 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

 

2、AcceptConnect()

View Code
 /******************************
   ** 作者: ***
  ** 變更時間: 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

 

3、AcceptTcpClientCallback()

View Code
 /******************************
   ** 作者: ***
  ** 變更時間: 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

 

4、ReadCallback()

View Code
  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)
           {
                //根據收到的信息的頭部來執行下面的操作
           }
       }          
  }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM