C#socket编程——UDP协议创建服务器端和客户端并进行通信

上次利用代码在一台电脑实现了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.首先我们先来创建服务器端

(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();

2.创建客户端

(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();

现在就可以进行测试,先启动服务器端,再启动客户端

C#socket编程——UDP协议创建服务器端和客户端并进行通信_第1张图片

你可能感兴趣的:(C#)