- 什么是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地址后,此代码即可运行
运行结果如下:
目前只能由客户端向服务器端发送消息,不能从服务端向客户端发送消息
下一章在此基础上做一个聊天室项目...