上次利用代码在一台电脑实现了TCP协议创建服务器端和客户端并进行通信,这次我们来用UDP协议进行实现。(建议先了解TCP协议如何实现数据传输)
(传送门:https://blog.csdn.net/wang568270833/article/details/89764756)
TCP协议和UDP协议有什么区别呢?这里先简单的说一下,TCP协议在收发数据之前有一个连接的功能,就是在服务器端调用Accept方法,等待客户端的连接,在客户端调用Connect方法建立连接,才可以进行通信;而UDP协议不需要建立连接的这一过程,可以直接根据IP地址和端口号就可以进行收发数据。
老样子,先看完整的代码
服务器端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace _059_socket编程_UDP协议_服务器端
{
class Program
{
private static Socket udpServer;
static void Main(string[] args)
{
//1.创建Socket
udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//2.绑定IP地址和端口号
udpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 5566));
new Thread(ReceiveMessage) { IsBackground = true }.Start();
//udpServer.Close();
Console.ReadKey();
}
static void ReceiveMessage()
{
while (true)
{
//3.接受数据
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = new byte[1024];//用来接受数据
int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法会把数据的来源(IP地址,端口号)放在第二个参数
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("从IP:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port.ToString() + "收到了数据:" + message);
}
}
}
}
客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace _002_socket编程_UDP协议_客户端
{
class Program
{
static void Main(string[] args)
{
//1.创建Socket
Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
while (true)
{
EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.1.145"), 5566);
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
udpClient.SendTo(data, serverPoint);
}
udpClient.Close();
Console.ReadKey();
}
}
}
(1)创建Socket(Socket属于命名空间System.Net.Sockets下的一个类),参数选择InterNetwork(内网)、Dgram(数据包),以及我们的Udp协议。
//1.创建Socket
udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
(2)绑定IP跟端口号
//2.绑定IP地址和端口号
udpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 5566));
(3)接受数据
//3.接受数据
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = new byte[1024];//用来接受数据
int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法会把数据的来源(IP地址,端口号)放在第二个参数
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("从IP:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port.ToString() + "收到了数据:" + message);
udpServer.Close();
(1)创建Socket
//1.创建Socket
Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
(2)发送数据
EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.1.145"), 5566);
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
udpClient.SendTo(data, serverPoint);
——————————————————————————————————————
此时就已经可以进行通信,但是只能进行一条数据的收发,我们可以使用线程,进行多条数据的收发。
我们先把服务器端中的接受数据写成一个方法
static void ReceiveMessage()
{
while (true)
{
//3.接受数据
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = new byte[1024];//用来接受数据
int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法会把数据的来源(IP地址,端口号)放在第二个参数
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("从IP:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port.ToString() + "收到了数据:" + message);
}
}
启动线程
new Thread(ReceiveMessage) { IsBackground = true }.Start();
现在就可以进行测试,先启动服务器端,再启动客户端