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

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


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

1. 主窗体设计(Form1.cs)
csharp 复制代码
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)

csharp 复制代码
// 关键控件定义
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卡顿

    • 独立线程处理接收操作(ReceiveUdpMessages和HandleTcpClient)

  3. 工业级优化

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

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

  4. 日志系统

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

  • 时间戳记录和滚动显示

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

四、扩展功能建议

  1. 数据保存

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

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

    csharp 复制代码
    // 添加定时心跳检测
    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. 异常处理

  • 生产环境需添加更多异常捕获逻辑
相关推荐
Cry丶1 小时前
ubuntu安装vsftpd
服务器·网络·ubuntu
zimoyin4 小时前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化
九零HTTP5 小时前
10月21号-CSDN配菜-IP池的5个坑
服务器·数据库·tcp/ip
SHENGWEI胜为5 小时前
交换机端口显示正常,终端却获取不到 IP 地址?从 DHCP 流程定位故障
服务器·网络·测试工具·缓存·通信工程
ITxiaobing20235 小时前
海外广告投放的 IP 定位服务怎么选?一份基于实测数据的选型参考
网络协议·tcp/ip·php
IMPYLH6 小时前
Linux 系统备份与镜像
linux·服务器·网络
小羊没烦恼!7 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
淘气包海鸟7 小时前
水声网络框架
网络·ns3·水
国科安芯8 小时前
星间激光通信终端CANFD控制网络的时延确定性与辐射可靠性
网络·嵌入式硬件·信息与通信·canfd·低轨卫星·商业航天·抗辐射
c#上位机8 小时前
C#上位机项目实战——exe项目调试更改dll中源代码
开发语言·c#