UDP Socket同一控制台双向收发文本功能实现求助
同一控制台实现UDP Socket双向文本收发的解决方案
你遇到的核心问题是同步操作阻塞了收发逻辑——不管是服务端还是客户端,同步的Receive()会卡住当前线程,没法同时处理输入和发送。UDP本身是无连接的,要实现双向通信,只需要让程序同时具备"监听接收"和"输入发送"的能力,用多线程或者异步任务就能搞定,而且完全可以把这俩功能整合到同一个控制台程序里。
核心思路
- 用后台线程/异步任务单独处理消息接收:因为
UdpClient.Receive()是阻塞式的,放后台线程就不会卡住主线程的输入操作 - 主线程专注处理控制台输入,发送消息给对方
- 双方都需要绑定端口用来接收,同时知道对方的IP和端口地址
完整整合代码示例
using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace UDPBidirectionalConsole { class Program { // 配置双方的IP和端口,这里用本地测试,你可以改成实际地址 private static readonly IPAddress TargetIp = IPAddress.Parse("127.0.0.1"); private const int LocalPort = 8888; private const int TargetPort = 9999; private static UdpClient _udpClient; private static bool _isRunning = true; static void Main(string[] args) { // 初始化UDP客户端,绑定本地端口用来接收消息 _udpClient = new UdpClient(LocalPort); Console.WriteLine($"已启动,本地端口:{LocalPort},目标端口:{TargetPort}"); Console.WriteLine("输入消息发送,输入'exit'退出"); // 启动后台线程处理接收消息 Thread receiveThread = new Thread(ReceiveMessages); receiveThread.IsBackground = true; receiveThread.Start(); // 主线程处理输入和发送 while (_isRunning) { string input = Console.ReadLine(); if (input.Equals("exit", StringComparison.OrdinalIgnoreCase)) { _isRunning = false; _udpClient.Close(); break; } // 将输入转为字节数组,发送到目标地址 byte[] sendBytes = Encoding.UTF8.GetBytes(input); _udpClient.Send(sendBytes, sendBytes.Length, new IPEndPoint(TargetIp, TargetPort)); } } static void ReceiveMessages() { try { while (_isRunning) { // 阻塞等待接收消息 IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] receiveBytes = _udpClient.Receive(ref remoteEndPoint); string receivedMessage = Encoding.UTF8.GetString(receiveBytes); // 打印收到的消息,标注来源 Console.WriteLine($"\n来自 [{remoteEndPoint.Address}:{remoteEndPoint.Port}] 的消息:{receivedMessage}"); Console.Write("请输入消息:"); // 恢复输入提示,避免控制台混乱 } } catch (SocketException) { // 客户端关闭时会抛出异常,这里直接忽略即可 } } } }
代码说明
- 端口配置:你需要启动两个控制台实例,一个用
LocalPort=8888, TargetPort=9999,另一个反过来LocalPort=9999, TargetPort=8888,这样就能互相收发了 - 后台接收线程:
ReceiveMessages方法在后台线程运行,持续监听端口,收到消息就打印出来 - 主线程发送:主线程读取控制台输入,输入"exit"就退出程序,否则把消息发送到目标端口
- 控制台输出优化:收到消息后打印
请输入消息:,避免输入提示被消息冲乱
测试方法
- 编译代码后,打开两个控制台窗口
- 第一个窗口运行程序(默认本地8888,目标9999)
- 第二个窗口运行程序时,修改代码里的
LocalPort为9999,TargetPort为8888,然后运行 - 现在两个窗口就能互相发送消息了,输入exit可以退出
这样就完美实现了同一控制台的UDP双向收发,而且可以两个实例互相通信~
内容的提问来源于stack exchange,提问作者brkcnplt
相关产品推荐
相关产品推荐

