上面是制作出来的助手软件样式,所有代码放在下面,可以直接复制粘贴使用,里面的每行代码我都有注释,会有两个引用文件,可以私信我获取。

TCPClient客户端:
using System.Configuration;
using System.Diagnostics;
using System.Net;
using System.Text;
using STTech.BytesIO.Tcp;
using text;

namespace TCPClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;  //关闭线程检测
            hostAddress.SelectedIndex = 0; //默认选中第一个主机地址
            hostPort.Text = "8080"; //默认端口号
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//告知计算机用什么编码给是解码
            client.OnDataReceived += Client_OnDataReceived; //引入监听事件,接收消息
            ASCII.Checked = true;  //接收配置默认选中ASCII显示
            sendASCII.Checked = true; //发送配置默认选中ASCII显示
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //获取本机ip地址
            var host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (var ip in host.AddressList)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    //Console.WriteLine("IP Address = " + ip.ToString());
                    hostAddress.Items.Add(ip.ToString());
                }
            }
        }
        //接收消息
        private void messageShow(string msg)
        {
            receivingBox.AppendText($"{DateTime.Now} {client.Host}:{client.Port}\r\n {msg} \r\n"); //接收框显示内容 client.Host主机地址 client.Port端口号
        }
        private void Client_OnDataReceived(object? sender, STTech.BytesIO.Core.DataReceivedEventArgs e) //e.Data 是字节,传输信息时使用字节传输
        {
            //接收消息时是否选中十六进制框
            if (ASCII.Checked)
            {
                string str = Encoding.GetEncoding("gb2312").GetString(e.Data).Replace("\0", "\\0"); //未选中就使用gb2312编码格式解码,转换成字符串显示
                messageShow(str);
            }
            else if (HEX.Checked)
            {
                string str1 = Transform.ToHexString(e.Data, " "); //选中后,将转化成十六进制字符串显示
                messageShow(str1);
            }
        }

        //接收配置清空按钮
        private void clearMessage_Click(object sender, EventArgs e)
        {
            receivingBox.Text = "";
        }
        //连接按钮
        TcpClient client = new TcpClient();  //引入TcpClient
        private void configuratio()
        {
            client.Host = hostAddress.Text; //主机地址赋值
            client.Port = int.Parse(hostPort.Text); //端口号赋值
        }
        private void connect_Click(object sender, EventArgs e)
        {
            if (hostAddress.Text == "")
            {
                MessageBox.Show("本地主机地址不能为空!");
            }
            else if (hostPort.Text == "")
            {
                MessageBox.Show("本机主机端口号不能为空!");
            }
            else
            {
                configuratio();//建立连接之前一定要更改配置
                client.Connect(); //建立连接
                //点击连接之后会禁用掉按钮,主机地址和端口号输入框禁用,点击断开会重新释放连接按钮
                connect.Enabled = false; //禁用连接按钮
                disconnect.Enabled = true; //启用断开按钮
                hostAddress.Enabled = false; //禁用主机地址选择框
                hostPort.Enabled = false; //禁用端口号输入框
                state.Text = "连接成功";
            }
        }

        //断开按钮
        private void disconnect_Click(object sender, EventArgs e)
        {
            //点击断开之后会禁用掉按钮,主机地址和端口号输入框启用,点击连接会重新释放断开按钮
            client.Disconnect();
            connect.Enabled = true; //启用连接按钮
            disconnect.Enabled = false; //禁用断开按钮
            hostAddress.Enabled = true; //启用主机地址选择框
            hostPort.Enabled = true;//启用端口号输入框
            state.Text = "断开连接";
        }


        //发送框操作

        private List<byte> sendBuffer = new List<byte>();   //发送数据缓存
        private void InputBox_Leave(object sender, EventArgs e)
        { 
            //选择十六进制
            if (sendHEX.Checked)  
            {
                if (DataEncoding.IsHexString(InputBox.Text.Replace(" ", "")))
                {
                    sendBuffer.Clear(); //存入数据之前清空缓存区
                    sendBuffer.AddRange(Transform.ToBytes(InputBox.Text.Replace(" ", ""))); //将数据转换成十六进制存入缓存区
                }
                else
                {
                    MessageBox.Show("请输入正确的十六进制数据");
                    InputBox.Select(); //提示格式错误后,聚焦输入框
                }
            }
            else
            {
                sendBuffer.Clear();//存入数据之前清空缓存区
                sendBuffer.AddRange(Encoding.GetEncoding("gb2312").GetBytes(InputBox.Text)); //将数据转换成字节存入缓存区
            }
        }
        //发送按钮
        private void sendBtn_Click(object sender, EventArgs e)
        {
            if (connect.Enabled == true)
            {
                MessageBox.Show("网络尚未连接,发送失败!");
            }
            else
            {
                if (InputBox.Text == "")
                {
                    MessageBox.Show("发送框不能为空!");
                }
                else
                {
                    client.Send(sendBuffer.ToArray()); //发送缓存区的数据
                }
            }
        }

        //发送配置清空按钮
        private void sendClear_Click(object sender, EventArgs e)
        {
            InputBox.Text = "";
        }

        private void sendHEX_CheckedChanged(object sender, EventArgs e)
        {
            if (sendHEX.Checked)
            {
                InputBox.Text = Transform.ToHexString(sendBuffer.ToArray()," "); //选择十六进制选择框时,将缓存区的字节转换为十六进制字符串显示
            }
        }

        private void sendASCII_CheckedChanged(object sender, EventArgs e)
        {
            if (sendASCII.Checked)
            {
                InputBox.Text = Encoding.GetEncoding("gb2312").GetString(sendBuffer.ToArray()).Replace("\0", "\\0");//选择ASCII选择框时,将缓存区的字节转换为字符串显示
            }
        }

    }
}
TCPSever服务端:
using System.Configuration;
using System.Net;
using System.Text;
using STTech.BytesIO.Tcp;
using TCPServer;

namespace TCPSever
{
    public partial class Form1 : Form
    {
        TcpServer sever = new TcpServer();
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//告知计算机使用什么编码格式解码
            ascii.Checked = true; //默认选中ASCII显示
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            hostAdress.SelectedIndex = 0; //本机地址默认选中第一个
            portNumber.Text = "8080"; //默认端口
            sever.Started += Sever_Started; //启动事件
            sever.Closed += Sever_Closed; //关闭事件
            sever.ClientConnected += Sever_ClientConnected; //处理新客户端连接
            sever.ClientDisconnected += Sever_ClientDisconnected; //处理客户端断开连接

            //获取本机ip地址
            var host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (var ip in host.AddressList)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    hostAdress.Items.Add(ip.ToString());
                }
            }
        }

        //处理客户端断开连接
        private void Sever_ClientDisconnected(object? sender, STTech.BytesIO.Tcp.Entity.ClientDisconnectedEventArgs e)
        {
            messageShow($"客户端[{e.Client.Host}:{e.Client.Port}]\r\n断开连接!");
        }

        //处理新客户端连接
        private void Sever_ClientConnected(object? sender, STTech.BytesIO.Tcp.Entity.ClientConnectedEventArgs e)
        {
            messageShow($"客户端[{e.Client.Host}:{e.Client.Port}]\r\n连接成功!");
            e.Client.OnDataReceived += Client_OnDataReceived; //监听客户端信息
        }

        //监听客户端信息
        private void Client_OnDataReceived(object? sender, STTech.BytesIO.Core.DataReceivedEventArgs e)
        {
            TcpClient tcpClient = (TcpClient)sender;
            //选中十六进制框
            if (hex.Checked) 
            {
                string str = Transform.ToHexString(e.Data, " ");
                messageShow($"收到来着客户端[{tcpClient.RemoteEndPoint}]的消息 \r\n {str}"); //将消息转化为十六进制字符串显示
            }
            else
            {
                string str1 = Encoding.GetEncoding("gb2312").GetString(e.Data).Replace("\0", "\\0"); //未选中就使用gb2312编码格式解码,转换成普通字符串显示
                messageShow($"收到来着客户端[{tcpClient.RemoteEndPoint}]的消息 \r\n {str1}");
            }
        }

        //关闭事件
        private void Sever_Closed(object? sender, EventArgs e)
        {
            messageShow("停止监听");
        }

        //启动事件
        private void Configuratio()
        {
            sever.Host = hostAdress.Text; //更改主机地址
            sever.Port = int.Parse(portNumber.Text); //更改端口号,portNumber里面的为字符串而端口号是number类型,所以要转换类型
        }
        private void Sever_Started(object? sender, EventArgs e)
        {
            messageShow("开始监听");
        }

        //开始监听按钮
        private void startListening_Click(object sender, EventArgs e)
        { 
            Configuratio(); //更改配置
            sever.StartAsync(); //开启监听
            startListening.Enabled = false; //禁用监听按钮
            stopListening.Enabled = true; //开启断开按钮
            hostAdress.Enabled = false; //禁用主机地址选择框
            portNumber.Enabled = false; //禁用端口号选择框
        }

        //停止监听按钮
        private void stopListening_Click(object sender, EventArgs e)
        {
            sever.CloseAsync(); //关闭监听
            startListening.Enabled = true;//启用监听按钮
            stopListening.Enabled = false;//禁用断开按钮
            hostAdress.Enabled = true;//启用主机地址选择框
            portNumber.Enabled = true;//启用端口号选择框
        }

        //接收消息方法
        private void messageShow(string msg) 
        {
            receiveMessage.AppendText($"[{DateTime.Now}],{msg}\r\n");
        }

        private void clearMessage_Click(object sender, EventArgs e)
        {
            receiveMessage.Text = "";
        }
    }
}

以上是个人见解,如有不对之处,望各位大佬指出。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐