C# 代码实现 TCP UDP

TCP与UDP

在后台都用到套接字Socket,当准确度要求高的时候,用TCP。若追求性能和速度,而且对准确度要求不高时,用UDP。

TCP协议和UDP协议连接过程的区别如下:

  • 基于连接与无连接;
  • 对系统资源的要求(TCP较多,UDP少);
  • UDP程序结构较简单;
  • TCP数据传输采用流模式与UDP则采用数据报模式;
  • TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

TCP

TCP是首选协议,它提供有保证的传输、错误校正和缓冲。
System.Net.Sockets. TcpClient类封装了TCP链接,提供属性字段来控制链接,包括缓冲、缓冲区的大小和超时。
TCP提供很多功能来确保数据的传输,它还提供了错误校正以及当数据丢失或数据包损坏时重新传输的功能。TCP可缓冲传入和传出的数据,还保证在传输过程中,在把数据包传输给应用程序之前重组杂乱的一系列数据包。

Client 发送端

 Console.WriteLine("按任意键开始连接服务器...");
            Console.ReadKey();
            //创建一个客户端Socket
            Socket clientSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //连接服务器
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
            Console.WriteLine("连接服务器成功");
            while (true)
            {
                Console.WriteLine("请输入要发送的消息:");
                string sendMsg = Console.ReadLine();
                if (!string.IsNullOrEmpty(sendMsg))
                {
                    //发送消息
                    clientSocket.Send(System.Text.Encoding.UTF8.GetBytes(sendMsg));
                    if (sendMsg == "quit")
                    {
                        //关闭连接
                        clientSocket.Close();
                        break;
                    }
                }
            }

Server 接收端

//创建一个服务器Socket
            Socket serverSocket = new (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定IP地址和端口号
            serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
            //开始监听
            serverSocket.Listen(10);
            Console.WriteLine("开始监听");
            //接收客户端连接
            Socket clientSocket = serverSocket.Accept();
            Console.WriteLine("客户端连接成功");
            while (true)
            {
                //接收消息
                byte[] data = new byte[1024];
                int length = clientSocket.Receive(data);
                string receiveMsg = Encoding.UTF8.GetString(data, 0, length);
                if (receiveMsg == "quit")
                {
                    Console.WriteLine($"客户端输入命令:{receiveMsg},表示客户端断开了连接!");
                    break;
                }
                Console.WriteLine("接收到消息:" + receiveMsg);
            }

UDP

通常在速度和性能要求比可靠性更高的应用程序中使用UDP,如视频流。
UDP是一个无连接的协议。

Client 发送端

static void Main(string[] args)
        {
            //做好链接准备
            UdpClient client = new();  //实例一个端口
            IPAddress remoteIP = IPAddress.Parse("10.254.244.82");  //假设发送给这个IP
            int remotePort = 11000;  //设置端口号
            IPEndPoint remotePoint = new(remoteIP, remotePort);  //实例化一个远程端点 
            Console.WriteLine("请输入发送内容...");
            while (true)
            {
                var sendString = Console.ReadLine();//要发送的数据
                if (!string.IsNullOrEmpty(sendString))
                {
                    byte[] sendData = Encoding.Default.GetBytes(sendString);
                    client.Send(sendData, sendData.Length, remotePoint);//将数据发送到远程端点
                    Console.WriteLine("数据发送成功!");
                    if (sendString == "quit")
                    {
                        client.Close();//关闭连接
                        break;
                    }
                }
            }
        }

Server 接收端

 static void Main(string[] args)
        {
            //实例化一个远程端点,IP和端口可以随意指定,等调用Client.Receive(ref remotePoint)时会将该端点改成真正发送端端点 
            UdpClient Client = new(11000);
            IPEndPoint RemotePoint = new(IPAddress.Any, 0);
            Console.WriteLine("正在准备接收数据...");
            while (true)
            {
                byte[] ReceiveData = Client.Receive(ref RemotePoint);
                string ReceiveString = Encoding.Default.GetString(ReceiveData);
                if (!string.IsNullOrEmpty(ReceiveString) && ReceiveString != "quit")
                {
                    Console.WriteLine(ReceiveString);
                }
                else
                {
                    Client.Close();//关闭连接
                    Console.WriteLine("数据接收完毕");
                    break;
                }
            }
        }
posted @   Smileher  阅读(212)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示