本文章做的程序使用UDP协议进行消息传输,使用简单的C#控制台应用程序。包含了两个设备之间的通信功能。
首先,用户需要在运行程序时输入设备1和设备2的IP地址,分别用两个变量device1IP和device2IP存下来。
Console.WriteLine("请输入设备1的IP地址:");
string device1IP = Console.ReadLine();
Console.WriteLine("请输入设备2的IP地址:");
string device2IP = Console.ReadLine();
参考C#如何获取当前主机的IP地址这篇文章,也可以进入任务管理器查看。
在主函数中,使用UdpClient类创建一个UDP客户端,监听指定的端口号(这里使用8888)。然后再创建两个IPEndPoint实例,分别对应设备1和设备2的IP地址和端口号。
using (UdpClient client = new UdpClient(Port))
{
IPEndPoint device1EndPoint = new IPEndPoint(IPAddress.Parse(device1IP), Port);
IPEndPoint device2EndPoint = new IPEndPoint(IPAddress.Parse(device2IP), Port);
}
接下来,我们启动一个接收消息的线程,不断监听设备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();
注意,在接收消息的线程中,Receive方法的第一个参数是ref device2EndPoint,这是为了确保每次接收消息时都从设备2的IP地址和端口接收,而不是设备1的。
接着,在主循环中,我们显示一个菜单供用户选择操作:发送消息或退出程序。用户可以根据提示进行选择。
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, device1EndPoint);
Console.WriteLine("消息已发送。");
break;
case "2":
Console.WriteLine("程序已退出。");
receiveThread.Abort();
return;
default:
Console.WriteLine("无效的选择,请重新输入。");
break;
}
}
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class Program
{
private const int Port = 8888;
public static void Main(string[] args)
{
Console.WriteLine("请输入设备1的IP地址:");
string device1IP = Console.ReadLine();
Console.WriteLine("请输入设备2的IP地址:");
string device2IP = Console.ReadLine();
using (UdpClient client = new UdpClient(Port))
{
IPEndPoint device1EndPoint = new IPEndPoint(IPAddress.Parse(device1IP), Port);
IPEndPoint device2EndPoint = new IPEndPoint(IPAddress.Parse(device2IP), Port);
Console.WriteLine("已启动程序。");
// 开启接收消息的线程
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, device1EndPoint);
Console.WriteLine("消息已发送。");
break;
case "2":
Console.WriteLine("程序已退出。");
receiveThread.Abort();
return;
default:
Console.WriteLine("无效的选择,请重新输入。");
break;
}
}
}
}
}
使用不同的编码,直接改Encoding的属性即可。
例如,下面的代码是把将字符串 message 使用 UTF-8 编码方式转换为字节数组 bytes。
byte[] bytes = Encoding.UTF8.GetBytes(message);
安卓获取当前设备的局域网IP地址
安卓监听端口接收消息