You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
            {
                // 客户端关闭时会抛出异常,这里直接忽略即可
            }
        }
    }
}

代码说明

  1. 端口配置:你需要启动两个控制台实例,一个用LocalPort=8888, TargetPort=9999,另一个反过来LocalPort=9999, TargetPort=8888,这样就能互相收发了
  2. 后台接收线程:ReceiveMessages方法在后台线程运行,持续监听端口,收到消息就打印出来
  3. 主线程发送:主线程读取控制台输入,输入"exit"就退出程序,否则把消息发送到目标端口
  4. 控制台输出优化:收到消息后打印请输入消息:,避免输入提示被消息冲乱

测试方法

  • 编译代码后,打开两个控制台窗口
  • 第一个窗口运行程序(默认本地8888,目标9999)
  • 第二个窗口运行程序时,修改代码里的LocalPort为9999,TargetPort为8888,然后运行
  • 现在两个窗口就能互相发送消息了,输入exit可以退出

这样就完美实现了同一控制台的UDP双向收发,而且可以两个实例互相通信~

内容的提问来源于stack exchange,提问作者brkcnplt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:09:11