1. 程式人生 > >(C#)TCP與UDP通訊流程、Tcplistener和Tcpclient進行通訊、UdpClient進行通訊

(C#)TCP與UDP通訊流程、Tcplistener和Tcpclient進行通訊、UdpClient進行通訊

1.基於Tcp協議的Socket通訊類似於B/S架構,面向連線,不同的是伺服器端可以向客戶端主動的推送訊息

流程順序。可靠性高

(1)建立一個套接字(Socket)

(2)繫結伺服器端IP地址及埠號-伺服器端

(3)利用Listen()方法開啟監聽-伺服器端

(4)利用Accept()方法等待客戶端連線-伺服器端

(5)Connect()方法與伺服器端建立連線-客戶端

(6)Send()方法向建立連線的主機發送訊息

(7)Recive()方法接收來自建立連線的主機的訊息

(8)closesocket關閉套接字

2.基於Udp的協議是無連線的。佔用資源少,響應速度快,延遲低。(不可靠連線)。資料報模式

流程順序

(1)建立一個套接字(Socket)

(2)繫結伺服器端IP地址及埠號-伺服器端

(3)通過SendTo()方法向制定的主機發送訊息

(4)通過ReciveFrom()方法接收指定主機發送的訊息

3.Tcplistener和Tcpclient進行通訊

通過listener來建立socket,與客戶端進行通訊。

Tcplistener和Tcpclient利用NetWorkStream類表示網路。使用GetStream方法返回網路流,

然後呼叫該流的Read和Write方法,對資料進行讀取和寫入。

Tcplistener和Tcpclient中維護了一個Socket物件。

伺服器

TcpListener建立傳入IP和Port,start開始監聽,AccptTcpClient方法得到客戶端的連線返回一個TcpClientduixiang

呼叫這個TcpClient物件中的GetStream方法得到一個NetworkStream,一個網路流。使用這個網路流的Read方法

得到byte型別的資料。

class Program
    {
        static void Main(string[] args)
        {
            //1.TcpListener對socket進行了一層封裝,在這個類中自己會去建立socket物件
            TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.103"), 7788);
            
            //2.開始監聽
            listener.Start();
            
            //3.等待客戶端連線過來
            TcpClient client = listener.AcceptTcpClient();

            //4.取得客戶端傳送過來的資料
            NetworkStream stream = client.GetStream();//得到了一個網路流,從這個網路流可以取得客戶端傳送過來的資料

            byte[] data = new byte[1024];
            while (true)
            {
                int length = stream.Read(data, 0, 1024);//讀取資料.引數:0是從哪個索引開始存放資料,1024最大讀取的位元組數。返回值為實際讀取的資料
                string message = Encoding.UTF8.GetString(data, 0, length);
                Console.WriteLine("Get message:" + message);
            }

            //5.釋放資源
            stream.Close();
            client.Close();
            listener.Stop();
            Console.ReadKey();
        }
    }

客戶端

通過建立TcpClient建立跟伺服器的連線,通過GetStream方法,獲得stream流,呼叫Write方法寫入資料,傳送資訊給伺服器

class Program
    {
        static void Main(string[] args)
        {
            //當我們建立tcpclient物件的時候,就會跟server去建立連線
            TcpClient client = new TcpClient("192.168.1.103", 7788);

            NetworkStream stream = client.GetStream();

            //read讀取資料,write寫入資料
            //利用一個死迴圈,重複向伺服器端傳送資料
            while (true)
            {
                string message = Console.ReadLine();
                byte[] data = Encoding.UTF8.GetBytes(message);
                stream.Write(data, 0, data.Length);
            }

            stream.Close();
            client.Close();
            Console.ReadKey();

        }
    }

4.udpclient

udp只有一個類

Server端

建立UdpClient繫結ip和port

建立一個IPEndPoint儲存接收到的資料來自什麼ip和port

class Program
    {
        static void Main(string[] args)
        {
            //建立udpclient繫結ip跟埠號
            UdpClient udpClient = new UdpClient
           (new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));

            while (true)
            {
                //接收資料
                IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = udpClient.Receive(ref point);//通過point確定資料來自哪個ip的哪個埠號
                string message = Encoding.UTF8.GetString(data);
                Console.WriteLine("Get Msg:" + message);
            }
            udpClient.Close();
            Console.ReadKey();
        }
    }

客戶端

建立UdpClient,使用Send方法將資料傳輸給制定的IP和Port

class Program
    {
        static void Main(string[] args)
        {
            UdpClient client = new UdpClient();
            while (true)
            {
                string message = Console.ReadLine();
                byte[] data = Encoding.UTF8.GetBytes(message);

                client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));
            }
            client.Close();
            Console.ReadKey();
        }
    }