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