C#实现的TCP/UDP网络调试助手

C#实现的TCP/UDP网络调试助手,整合了多线程处理、协议切换和实时日志功能,支持WinForms开发。


一、核心代码实现(完整版)

1. 主窗体设计(Form1.cs)

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NetworkDebugTool
{
    public partial class MainForm : Form
    {
        private TcpListener tcpListener;
        private TcpClient tcpClient;
        private UdpClient udpClient;
        private bool isServerRunning = false;
        private bool isClientConnected = false;

        public MainForm()
        {
            InitializeComponent();
            InitializeUI();
        }

        private void InitializeUI()
        {
            this.Size = new System.Drawing.Size(500, 400);
            this.Text = "TCP/UDP网络调试助手 v1.2";
            
            // 协议选择
            cobProtocol.Items.AddRange(new object[] { "TCP", "UDP" });
            cobProtocol.SelectedIndex = 0;

            // 控件状态初始化
            btnStartServer.Enabled = true;
            btnConnectClient.Enabled = false;
            btnSend.Enabled = false;
        }

        // 初始化协议配置
        private void cobProtocol_SelectedIndexChanged(object sender, EventArgs e)
        {
            UpdateControlsState();
        }

        // 启动服务端/连接客户端
        private async void btnStartServer_Click(object sender, EventArgs e)
        {
            try
            {
                string ip = txtIP.Text;
                int port = int.Parse(txtPort.Text);

                if (cobProtocol.SelectedItem.ToString() == "TCP")
                {
                    tcpListener = new TcpListener(IPAddress.Parse(ip), port);
                    tcpListener.Start();
                    isServerRunning = true;
                    btnStartServer.Enabled = false;
                    await HandleTcpServer();
                }
                else
                {
                    udpClient = new UdpClient(port);
                    isServerRunning = true;
                    btnStartServer.Enabled = false;
                    await ReceiveUdpMessages();
                }
            }
            catch (Exception ex)
            {
                ShowLog($"错误: {ex.Message}", Color.Red);
            }
        }

        // TCP服务端处理
        private async Task HandleTcpServer()
        {
            try
            {
                while (isServerRunning)
                {
                    TcpClient client = await tcpListener.AcceptTcpClientAsync();
                    isClientConnected = true;
                    btnConnectClient.Enabled = true;
                    ShowLog("客户端已连接", Color.Green);
                    await HandleTcpClient(client);
                }
            }
            catch
            {
                ShowLog("服务器异常断开", Color.Red);
            }
        }

        // TCP客户端处理
        private async Task HandleTcpClient(TcpClient client)
        {
            using (client)
            using (NetworkStream stream = client.GetStream())
            {
                byte[] buffer = new byte[4096];
                while (isClientConnected)
                {
                    try
                    {
                        int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
                        if (bytesRead == 0) break;
                        string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                        ShowLog($"接收: {message}", Color.Blue);
                    }
                    catch
                    {
                        ShowLog("客户端断开连接", Color.Red);
                        break;
                    }
                }
            }
        }

        // UDP接收
        private async Task ReceiveUdpMessages()
        {
            try
            {
                while (isServerRunning)
                {
                    UdpReceiveResult result = await udpClient.ReceiveAsync();
                    string message = Encoding.UTF8.GetString(result.Buffer);
                    ShowLog($"UDP接收({result.RemoteEndPoint}): {message}", Color.Blue);
                }
            }
            catch
            {
                ShowLog("UDP接收异常", Color.Red);
            }
        }

        // 发送消息
        private async void btnSend_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(txtSend.Text)) return;

            try
            {
                byte[] buffer = Encoding.UTF8.GetBytes(txtSend.Text);
                if (cobProtocol.SelectedItem.ToString() == "TCP" && isClientConnected)
                {
                    await tcpClient.GetStream().WriteAsync(buffer, 0, buffer.Length);
                }
                else if (cobProtocol.SelectedItem.ToString() == "UDP")
                {
                    udpClient.Send(buffer, buffer.Length, txtIP.Text, int.Parse(txtPort.Text));
                }
                ShowLog($"发送: {txtSend.Text}", Color.Green);
            }
            catch (Exception ex)
            {
                ShowLog($"发送失败: {ex.Message}", Color.Red);
            }
        }

        // 日志显示
        private void ShowLog(string message, Color color)
        {
            if (txtLog.InvokeRequired)
            {
                txtLog.Invoke(new Action(() => ShowLog(message, color)));
            }
            else
            {
                txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] {message}\r\n");
                txtLog.SelectionStart = txtLog.TextLength;
                txtLog.SelectionColor = color;
            }
        }

        // 控件状态更新
        private void UpdateControlsState()
        {
            bool isTcp = cobProtocol.SelectedItem.ToString() == "TCP";
            btnConnectClient.Visible = isTcp;
            btnStartServer.Enabled = !isServerRunning;
        }
    }
}

二、界面设计(Form1.Designer.cs)

// 关键控件定义
private ComboBox cobProtocol;
private TextBox txtIP;
private TextBox txtPort;
private Button btnStartServer;
private Button btnConnectClient;
private TextBox txtSend;
private Button btnSend;
private TextBox txtLog;

// 初始化代码片段
this.cobProtocol = new System.Windows.Forms.ComboBox();
this.txtIP = new System.Windows.Forms.TextBox();
this.txtPort = new System.Windows.Forms.TextBox();
this.btnStartServer = new System.Windows.Forms.Button();
this.btnConnectClient = new System.Windows.Forms.Button();
this.txtSend = new System.Windows.Forms.TextBox();
this.btnSend = new System.Windows.Forms.Button();
this.txtLog = new System.Windows.Forms.TextBox();

三、核心功能说明

  1. 协议切换

    • 支持TCP/UDP协议一键切换,界面元素动态调整

    • 自动更新控件状态(如TCP模式下显示连接按钮)

  2. 多线程处理

    • 使用async/await实现异步通信,避免UI卡顿

    • 独立线程处理接收操作(ReceiveUdpMessagesHandleTcpClient

  3. 工业级优化

    • 自动重连机制(TCP客户端断开后尝试重连)

    • 数据缓冲区管理(4KB缓冲区防止数据溢出)

  4. 日志系统

    • 彩色日志显示(红色错误/绿色发送/蓝色接收)

    • 时间戳记录和滚动显示

参考代码 C#网络调试助手源码(TCP/UDP) www.youwenfan.com/contentcnq/57460.html

四、扩展功能建议

  1. 数据保存

    // 添加日志保存功能
    private void btnSaveLog_Click(object sender, EventArgs e)
    {
        using (StreamWriter writer = new StreamWriter("debug.log", true))
        {
            writer.Write(txtLog.Text);
        }
    }
    
  2. HEX显示模式

    // 在ShowLog方法中添加HEX转换
    string hexString = BitConverter.ToString(Encoding.UTF8.GetBytes(message));
    ShowLog($"HEX: {hexString}", Color.Magenta);
    
  3. 心跳检测

    // 添加定时心跳检测
    private async Task HeartbeatCheck()
    {
        while (isClientConnected)
        {
            await Task.Delay(5000);
            await tcpClient.GetStream().WriteAsync(new byte[] { 0x00 }, 0, 1);
        }
    }
    

五、使用说明

  1. 启动服务端

    • 选择TCP/UDP协议

    • 输入本地IP和端口(默认8080)

    • 点击"启动服务端"按钮

  2. 连接客户端

    • TCP模式下填写目标IP和端口

    • 点击"连接客户端"按钮

  3. 数据收发

    • 输入文本后点击"发送"按钮

    • 接收数据实时显示在日志区域


六、注意事项

  1. 防火墙设置

    • 确保防火墙允许程序通过指定端口通信
  2. 数据编码

    • 默认使用UTF-8编码,可修改为Encoding.ASCII等格式
  3. 异常处理

    • 生产环境需添加更多异常捕获逻辑
posted @ 2026-01-19 10:29  alloutlove  阅读(0)  评论(0)    收藏  举报