[C#]手把手教你打造Socket的TCP通訊連接(四)


上一篇中,我們已經學會了服務器的代碼,至此我們的SOcket的TCP通訊連接已經完成。這一篇我們總結一下。

服務器開啟后,開始異步監聽客戶端連接。客戶端連接時,實例化TCPListenerClient,並開始異步監聽數據。接收到數據時,判斷數據長度,0則為斷開連接,不為0則引發接收數據完成事件。

可以通過TCPListenerClient發送數據或斷開連接。

服務器關閉時要先斷開所有客戶端連接。

客戶端連接服務器,開始異步接收服務器數據。接收到數據時,判斷數據長度,0則為斷開連接,不為0則引發接收數據完成事件。

客戶端連接服務器后,可以發送數據與斷開連接。

SocketHandler是專門處理接收發送的對象。

發送數據時,要判斷發送隊列是否有數據正在發送或等待發送。如果有數據,則把要發送的數據加入發送隊列。

發送數據過程,先發送要發送數據的長度=>ushor類型=>byte[]類型。然后再發送主數據。

發送完成時,判斷發送隊列是否還有數據,有則繼續發送。返回是否發送成功。遇到異常則不成功。

接收數據時,先接收byte[2]的主要數據長度頭信息,轉換為ushort類型。

然后接收這個長度的數據,EndRead里要判斷是否接收完全,不完全則繼續接收。

接收完成后直接返回接收到的數據。

 

下面發一個簡易測試延遲程序的示例代碼。

客戶端。

View Code
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);
        }
    }
}

服務器。

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


免責聲明!

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



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