C# TCP與UDP


Http使用端口是80
SMTP使用端口是25
TCP是首選協議,它提供有保證的傳輸、錯誤校正和緩沖。
System.Net.Sockets. TcpClient類封裝了TCP鏈接,提供屬性字段來控制鏈接,包括緩沖、緩沖區的大小和超時。
TCP提供很多功能來確保數據的傳輸,它還提供了錯誤校正以及當數據丟失或數據包損壞時重新傳輸的功能。TCP可緩沖傳入和傳出的數據,還保證在傳輸過程中,在把數據包傳輸給應用程序之前重組雜亂的一系列數據包。
發送端
            TcpClient tcpClient = new TcpClient(textBox1.Text, Int32.Parse(textBox2.Text));
            NetworkStream ns = tcpClient.GetStream();
            FileStream fs = File.Open("Send.txt", FileMode.Open);

            int data = fs.ReadByte();
            while (data != -1)
            {
                ns.WriteByte((byte)data);
                data = fs.ReadByte();
            }
            fs.Close();
            ns.Close();
            tcpClient.Close();        

  接受端

            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            Int32 port = 2112;
            System.Net.Sockets.TcpListener tcpListener = new TcpListener(localAddr, port);
            tcpListener.Start();

            TcpClient tcpClient = tcpListener.AcceptTcpClient();

            NetworkStream ns = tcpClient.GetStream();
            StreamReader sr = new StreamReader(ns);
            string result = sr.ReadToEnd();
            Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
            tcpClient.Close();
            tcpListener.Stop();        

  

UDP, 通常在速度和性能要求比可靠性更高的應用程序中使用UDP,如視頻流。
UDP是一個無連接的協議。
看別人的,調試,有點小問題,就當參考。
客戶
//System.Net.Sockets.UdpClient udpClient = new UdpClient();
            //string sendMsg = "Hello Echo Server";
            //byte[] sendBytes = Encoding.ASCII.GetBytes(sendMsg);
            //udpClient.Send(sendBytes, sendBytes.Length, "UdpTest.net", 7);
            //IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 9093);
            //byte[] rcvBytes = udpClient.Receive(ref endPoint);
            //string rcvMessage = Encoding.ASCII.GetString(rcvBytes, 0, rcvBytes.Length);
            //Console.WriteLine(rcvMessage);
            byte[] data = new byte[1024];
            string intput, stringData;
            IPEndPoint iPEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9095);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            string welcome = "Hello,Where are you there";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, iPEnd);//將數據發送到指定的終結點

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sender;
            data = new byte[1024];
            int recv = server.ReceiveFrom(data, ref Remote);
            Console.WriteLine("Message received from{0}", Remote.ToString());

            while (true)
            {
                intput = Console.ReadLine();
                if (intput == "text")
                {
                    break;
                }
                server.SendTo(Encoding.ASCII.GetBytes(intput), Remote);//將數據發送到指定的終結點Remote
                data = new byte[1024];
                recv = server.ReceiveFrom(data, ref Remote);//從Remote接受數據
                stringData = Encoding.ASCII.GetString(data, 0, data.Length);
                Console.WriteLine(stringData);
            }

            Console.WriteLine("stop");
            server.Close();

  

服務
int recv;
            byte[] data = new byte[1024];
            IPEndPoint ipEp = new IPEndPoint(IPAddress.Any, 9095);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(ipEp);
            Console.WriteLine("wait....");

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 9095);
            EndPoint Remote = (EndPoint)(sender);
            recv = socket.ReceiveFrom(data, ref Remote);
            Console.WriteLine("Message receive from {0}", Remote.ToString());

            string welcome = "Welcome to my server";
            data = Encoding.ASCII.GetBytes(welcome);
            socket.SendTo(data, data.Length, SocketFlags.None, Remote);
            while (true)
            {
                data = new byte[1024];
                recv = socket.ReceiveFrom(data, ref Remote);
                socket.SendTo(data, recv, SocketFlags.None, Remote);
            }

  

TCP與UDP
在后台都用到套接字Socket,當准確度要求高的時候,用TCP。若追求性能和速度,而且對准確度要求不高時,用UDP。
 
 TCP協議和UDP協議連接過程的區別如下: 
  1.基於連接與無連接; 
  2.對系統資源的要求(TCP較多,UDP少); 
  3.UDP程序結構較簡單; 
  4.TCP數據傳輸采用流模式與UDP則采用數據報模式 ; 
  5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。


免責聲明!

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



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