Socket C# UDP 通信

  • 什么是UDP

两台电脑要互相通讯(比如:QQ聊天)就必须要先建立连接,而建立连接用的就是Socket技术,而建立Socket连接就需要底层协议:TCP协议和UDP协议。这两个协议就是规则,遵循了这个规则就可以建立链接 。

TCP 协议是一种可靠的协议,它保证数据在传输过程中不会丢失或损坏。TCP 协议通过连接的建立、数据的传输和连接的释放等步骤来保证数据的完整性和可靠性。TCP 协议适合于需要数据传输可靠性的场合,例如文件传输、网页浏览等。

UDP 协议是一种不可靠的协议,它不对数据传输的可靠性做出保证。UDP 协议的传输速度比 TCP 更快,但在传输过程中数据可能会丢失或损坏。UDP 协议适合于实时通信,例如视频和音频流的传输。

二者具体的相同点和不同点 如下:

TCP 和UDP 协议相同点:

TCP和UDP都是工作在传输层  

TCP 和 UDP 协议不同点:

UDP协议:无连接、面向报文

优点:速度快、效率高,对资源和CPU占用少

缺点:不可靠,易丢包 

应用场景:语音通话、视频通话(丢个一两帧没事)、VPN等

报文格式:源IP地址+目的IP地址+源端口+目的端口+数据

TCP协议:有连接、面向数据流,连接时需要三次握手、断开时需要四次挥手

优点:安全可靠,不丢数据

缺点:速度慢、效率低、对资源和CPU占用率高

应用场景:发邮件、发文件

数据格式:源端口号+目的端口号+序列号+确认号+数据偏移+标志符

本章着重讲解UDP通信,TCP通信见上一章,UDP整体代码框架如下:

代码运行平台 Visual Studio 2019

服务端代码:

/*******
 * 
 * UDP通讯:服务器端
 * 和TCP不一样的地方:
 * 1、不需要Listen()和Accept()了
 * 2、UDP中用的是_SocketServer.ReceiveFrom(),而不是_SocketServer.Receive()
 * 
 * *******/
using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SocketServer_UDP
{
    class Server
    {
        private Socket _SocketServer;
        private IPEndPoint endPoint;
        public Server()
        {
            //定义IP地址和端口号
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000); //这里端口号最好超过1000,一台电脑有6万多个端口,是从小到大按顺序分配的,本机应用已占用前部分的端口
            _SocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //绑定IP地址和端口号
            _SocketServer.Bind(endPoint);
            Console.WriteLine("服务器端已启动...");
            EndPoint ep = (EndPoint)endPoint;
            while (true)
            {
                //准备一个“数据缓存”
                byte[] byteArray = new byte[1024 * 1024];
                //接收客户端发来的数据,返回数据真实的长度
                int trueClientMsgLength = _SocketServer.ReceiveFrom(byteArray, ref ep); //这里要将IPEndPoint参数转化为EndPoint类型的参数
                //byte数组转string
                string strMsg = Encoding.UTF8.GetString(byteArray, 0, trueClientMsgLength);
                Console.WriteLine("客户端发来数据: " + strMsg);
            }
        }

        static void Main(string[] args)
        {
            Server server = new Server();
        }
    }
}

客户端代码:

/************
 * 
 * UDP端通信:客户端
 * 和TCP不一致的地方:
 * 1、UDP发送用的是SendTo(),而TCP用的是Send()
 * 
 * ************/
using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SocketClient_UDP
{
     class Client
    {
        IPEndPoint endPoint;
        Socket _SocketClient;

        public Client()
        {
            //定义IP地址和端口号
            endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000);
            _SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);           
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        public void SendMsg()
        {
            EndPoint ep = (EndPoint)endPoint;
            while (true)
            {
                string strMsg = Console.ReadLine();
                Console.WriteLine("我:"+strMsg);
                //将string类型的信息转化为byte[]类型
                byte[] byteArray = Encoding.UTF8.GetBytes(strMsg);
                //发送消息
                _SocketClient.SendTo(byteArray, ep); //这里要将IPEndPoint类型的参数转化为EndPoint类型的参数
            }           
        }
        static void Main(string[] args)
        {
            Client clientObj = new Client();
            clientObj.SendMsg();
        }
    }
}

大家修改各自的IP地址后,此代码即可运行

运行结果如下:

目前只能由客户端向服务器端发送消息,不能从服务端向客户端发送消息

下一章在此基础上做一个聊天室项目...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值