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卡顿

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

  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. 异常处理

  • 生产环境需添加更多异常捕获逻辑
相关推荐
Zach_yuan21 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
2501_9307077821 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
猫头虎21 小时前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy
初级代码游戏1 天前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
charlotte102410241 天前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
Zaralike1 天前
Linux 服务器网络不通排查 SOP(标准操作流程)
linux·服务器·网络
云姜.1 天前
网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
网络·网络协议
!chen1 天前
LabVIEW TCP Server端工具TCP通信
网络·tcp/ip·labview
大空大地20261 天前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
枷锁—sha1 天前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全