上一篇中,我們已經學會了服務器的代碼,至此我們的SOcket的TCP通訊連接已經完成。這一篇我們總結一下。
服務器開啟后,開始異步監聽客戶端連接。客戶端連接時,實例化TCPListenerClient,並開始異步監聽數據。接收到數據時,判斷數據長度,0則為斷開連接,不為0則引發接收數據完成事件。
可以通過TCPListenerClient發送數據或斷開連接。
服務器關閉時要先斷開所有客戶端連接。
客戶端連接服務器,開始異步接收服務器數據。接收到數據時,判斷數據長度,0則為斷開連接,不為0則引發接收數據完成事件。
客戶端連接服務器后,可以發送數據與斷開連接。
SocketHandler是專門處理接收發送的對象。
發送數據時,要判斷發送隊列是否有數據正在發送或等待發送。如果有數據,則把要發送的數據加入發送隊列。
發送數據過程,先發送要發送數據的長度=>ushor類型=>byte[]類型。然后再發送主數據。
發送完成時,判斷發送隊列是否還有數據,有則繼續發送。返回是否發送成功。遇到異常則不成功。
接收數據時,先接收byte[2]的主要數據長度頭信息,轉換為ushort類型。
然后接收這個長度的數據,EndRead里要判斷是否接收完全,不完全則繼續接收。
接收完成后直接返回接收到的數據。
下面發一個簡易測試延遲程序的示例代碼。
客戶端。

namespace PingTesterClient { class Program { static TCPClient client; static void Main(string[] args) { client = new TCPClient(); client.ReceiveCompleted += Receive; Console.WriteLine("請輸入IP地址:"); client.Connect(new System.Net.IPEndPoint(IPAddress.Parse(Console.ReadLine()), 5000)); byte[] data = BitConverter.GetBytes(DateTime.Now.TimeOfDay.TotalMilliseconds); client.SendAsync(data); Console.ReadLine(); } private static void Receive(object sender, SocketEventArgs e) { Console.WriteLine(DateTime.Now.TimeOfDay.TotalMilliseconds - BitConverter.ToDouble(e.Data, 0)); System.Threading.Thread.Sleep(100); byte[] data = BitConverter.GetBytes(DateTime.Now.TimeOfDay.TotalMilliseconds); client.SendAsync(data); } } }
服務器。

namespace PingTesterServer { class Program { static void Main(string[] args) { var listener = new TCPListener(); listener.Port = 5000; listener.ReceiveCompleted += listener_ReceiveCompleted; listener.Start(); Console.ReadLine(); } static void listener_ReceiveCompleted(object sender, SocketEventArgs e) { e.Socket.SendAsync(e.Data); } } }
客戶端發送當前時間轉byte[]數據
服務器接收到后又發送客戶端發送的數據。
客戶端收到數據后,用當前時間減去收到的時間,除以2,得到網絡延遲。
項目文件:http://files.cnblogs.com/Kation/Wodsoft.Net.rar
原文地址:http://www.cnblogs.com/Kation/archive/2013/03/10/2952263.html