C#实现局域网之间互相传递消息(同一网络下)

发送设备的代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

private const int Port = 8888;
private const string Device2IPAddress = "接收设备的IP地址";
static void Main(string[] args)
{
    
    
    Console.WriteLine("请输入一条消息:");
    string? message = Console.ReadLine();

#pragma warning disable CS8604 // 引用类型参数可能为 null。
    byte[] bytes = Encoding.ASCII.GetBytes(message);
#pragma warning restore CS8604 // 引用类型参数可能为 null。

    using (UdpClient client = new UdpClient())
    {
    
    
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(Device2IPAddress), Port);
        client.Send(bytes, bytes.Length, endPoint);
    }

    Console.WriteLine("消息已发送!");
}

接受设备的代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

private const int Port = 8888;

public static void Main(string[] args)
{
    
    
    using (UdpClient client = new UdpClient(Port))
    {
    
    
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, Port);
        byte[] bytes = client.Receive(ref endPoint);
        string message = Encoding.ASCII.GetString(bytes);
        
        Console.WriteLine("收到消息:");
        Console.WriteLine(message);
    }
}

发送中文

使用Unicode编码对中文文本进行编码和解码。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

private const int Port = 8888;
private const string Device2IPAddress = "接收设备的IP地址";
static void Main(string[] args)
{
    
    
    Console.WriteLine("请输入一条消息:");
    string? message = Console.ReadLine();

#pragma warning disable CS8604 // 引用类型参数可能为 null。
    byte[] bytes = Encoding.Unicode.GetBytes(message);
#pragma warning restore CS8604 // 引用类型参数可能为 null。

    using (UdpClient client = new UdpClient())
    {
    
    
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(Device2IPAddress), Port);
        client.Send(bytes, bytes.Length, endPoint);
    }

    Console.WriteLine("消息已发送!");
}

接收中文

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class Device2
{
    
    
    private const int Port = 8888;

    public static void Main(string[] args)
    {
    
    
        using (UdpClient client = new UdpClient(Port))
        {
    
    
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, Port);
            byte[] bytes = client.Receive(ref endPoint);
            string message = Encoding.Unicode.GetString(bytes);
            
            Console.WriteLine("收到消息:");
            Console.WriteLine(message);
        }
    }
}

循环发送消息

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

private constint Port = 8888;
private const string Device2IPAddress = "接收设备的IP地址";
static void Main(string[] args)
{
    
    
    using (UdpClient client = new UdpClient())
    {
    
    
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(Device2IPAddress), Port);

        while (true)
        {
    
    
            Console.WriteLine("请输入一条消息:");
            string? message = Console.ReadLine();

#pragma warning disable CS8604 // 引用类型参数可能为 null。
            byte[] bytes = Encoding.Unicode.GetBytes(message);
#pragma warning restore CS8604 // 引用类型参数可能为 null。
            client.Send(bytes, bytes.Length, endPoint);

            Console.WriteLine("消息已发送!");
        }
    }
}

循环接收消息

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class Device2
{
    
    
    private const int Port = 8888;

    public static void Main(string[] args)
    {
    
    
        using (UdpClient client = new UdpClient(Port))
        {
    
    
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, Port);
            
            while (true)
            {
    
    
                byte[] bytes = client.Receive(ref endPoint);
                string message = Encoding.Unicode.GetString(bytes);
                
                Console.WriteLine("收到消息:");
                Console.WriteLine(message);
            }
        }
    }
}

同时接收消息和发送消息

设备1

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

private const int Port = 8888;
private const string Device2IPAddress = "设备2的IP";
private const string Device1IPAddress = "设备1的IP";

static void Main(string[] args)
{
    
    
    using (UdpClient client = new UdpClient(Port))
    {
    
    
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(Device2IPAddress), Port);
        IPEndPoint device1EndPoint = new IPEndPoint(IPAddress.Parse(Device1IPAddress), Port);

        Console.WriteLine("已启动设备1。");

        // 开启接收消息的线程
        var receiveThread = new System.Threading.Thread(() =>
        {
    
    
            while (true)
            {
    
    
                Console.WriteLine("等待接收消息...");
                byte[] bytes = client.Receive(ref device1EndPoint);
                string receivedMessage = Encoding.Unicode.GetString(bytes);

                Console.WriteLine("收到的消息:");
                Console.WriteLine(receivedMessage);
            }
        });
        receiveThread.Start();

        while (true)
        {
    
    
            Console.WriteLine("请选择操作:");
            Console.WriteLine("1. 发送消息");
            Console.WriteLine("2. 退出");

            string input = Console.ReadLine();

            switch (input)
            {
    
    
                case "1":
                    Console.WriteLine("请输入一条消息:");
                    string message = Console.ReadLine();

                    byte[] bytes = Encoding.Unicode.GetBytes(message);
                    client.Send(bytes, bytes.Length, endPoint);

                    Console.WriteLine("消息已发送。");
                    break;
                case "2":
                    Console.WriteLine("设备1已退出。");
                    receiveThread.Abort();
                    return;
                default:
                    Console.WriteLine("无效的选择,请重新输入。");
                    break;
            }
        }
    }
}

设备2

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

privateconst int Port = 8888;
private const string Device1IPAddress = "设备1的IP";
private const string Device2IPAddress = "设备2的IP";

public static void Main(string[] args)
{
    
    
    using (UdpClient client = new UdpClient(Port))
    {
    
    
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(Device1IPAddress), Port);
        IPEndPoint device2EndPoint = new IPEndPoint(IPAddress.Parse(Device2IPAddress), Port);

        Console.WriteLine("已启动设备2。");

        // 开启接收消息的线程
        var receiveThread = new System.Threading.Thread(() =>
        {
    
    
            while (true)
            {
    
    
                Console.WriteLine("等待接收消息...");
                byte[] bytes = client.Receive(ref device2EndPoint);
                string receivedMessage = Encoding.Unicode.GetString(bytes);

                Console.WriteLine("收到的消息:");
                Console.WriteLine(receivedMessage);
            }
        });
        receiveThread.Start();

        while (true)
        {
    
    
            Console.WriteLine("请选择操作:");
            Console.WriteLine("1. 发送消息");
            Console.WriteLine("2. 退出");

            string input = Console.ReadLine();

            switch (input)
            {
    
    
                case "1":
                    Console.WriteLine("请输入一条消息:");
                    string message = Console.ReadLine();

                    byte[] bytes = Encoding.Unicode.GetBytes(message);
                    client.Send(bytes, bytes.Length, endPoint);

                    Console.WriteLine("消息已发送。");
                    break;
                case "2":
                    Console.WriteLine("设备2已退出。");
                    receiveThread.Abort();
                    return;
                default:
                    Console.WriteLine("无效的选择,请重新输入。");
                    break;
            }
        }
    }
}

不同的字符编码

使用不同的编码,直接改Encoding的属性即可。

例如,下面的代码是把将字符串 message 使用 UTF-8 编码方式转换为字节数组 bytes。

byte[] bytes = Encoding.UTF8.GetBytes(message);

猜你喜欢

转载自blog.csdn.net/weixin_44499065/article/details/132311509