TCP連接之服務器端,涉及到如下三個函數,分別是:
/***************************** ** 函數功能: 服務端監聽 ** 輸入參數: ** 輸出參數: ******************************/ private void ServerListen(){}
/****************************** ** 函數功能: 用於與客戶端取得連接 ** 輸入參數: ** 輸出參數: ******************************/ private void AcceptConnect(){}
/****************************** ** 函數功能: 接受客戶端發回的信息 ** 輸入參數: ar:客戶端發回的信息 ** 輸出參數: ******************************/ private void ReadCallback(IasyncResult ar){}
三者的關系圖如下:
具體代碼如下:
1、ServerListen()

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()

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

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

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