• C#基于BytesIO程序包的TCP Client客户端窗体程序


    1. 安装BytesIO程序包

    1、点击工程项目,然后右键,选择“管理NuGet程序包”,如下:
    在这里插入图片描述
    2、出现如下界面,然后在搜索框输入BytesIO,然后安装下面的BytesIO.TCP的程序包。
    在这里插入图片描述
    注意BytesIO.TCP是依赖.NET框架4.5以上的版本的,所以创建工程的时候要选择高点的版本。

    2. 做一个简单的界面

    程序界面如下,做得比较丑。
    在这里插入图片描述
    其中Host IP是远程主机IP,Host Port是远程主机端口号。

    3. 各控件相关代码

    3.1 public Form()窗体构造函数代码

    在Form()函数中,主要做了生成窗体时,获取了本机所有网卡的IP地址,然后预设了一些控件的默认值。最后还监听了一些tcp client相关的事件,代码如下:

     public Form1()
     {
         InitializeComponent();
         CheckForIllegalCrossThreadCalls = false;
    
         // 获取本地可用的IP地址
         string strHostIP = Dns.GetHostName();
         IPAddress[] ipadrlist = Dns.GetHostAddresses(strHostIP);
         foreach (IPAddress ipaddr in ipadrlist)
         {
             if (ipaddr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                 cbbHostIP.Items.Add(ipaddr.ToString());
         }
         cbbHostIP.Items.Add("127.0.0.1");   // 最后加上回环测试地址
         cbbHostIP.SelectedIndex = 0;
    
         tbHostPort.Text = "8080";
    
         client.OnDataReceived += Client_OnDataReceived;                     // 接收事件函数
         client.OnConnectedSuccessfully += Client_OnConnectedSuccessfully;   // 连接成功事件函数
         client.OnDisconnected += Client_OnDisconnected;                     // 断开连接事件函数
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3.2 请求连接按钮点击事件

    在界面上输入远程主机IP和对应的远程主机端口后,点击一下按钮,就会去连接这个服务端了,点击事件函数如下:

    private void btnConnect_Click(object sender, EventArgs e)
    {
        if (client.IsConnected == false)
        {
            client.Host = cbbHostIP.Text;				// 远程主机IP
            client.Port = int.Parse(tbHostPort.Text);	// 远程主机端口
            client.Connect();
        }
        else
        {
            client.Disconnect();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    IsConnected属性是BytesIO.TCP程序包自带的一个属性,我们可以通过这个属性判断当前是否已经连接了,如果没有连接那么点击一下,就调用 client.Connect(); 函数进行连接即可。

    其他各部分源码看下面的整体工程代码…

    4. 整个工程项目的源码如下

    using System;
    using System.Collections.Generic;
    using STTech.BytesIO.Core;
    using STTech.BytesIO.Tcp;
    using System.Windows.Forms;
    using System.Net;
    
    namespace BytesIO_TCP_Client
    {
        public partial class Form1 : Form
        {
            private TcpClient client = new TcpClient();
    
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
    
                // 获取本地可用的IP地址
                string strHostIP = Dns.GetHostName();
                IPAddress[] ipadrlist = Dns.GetHostAddresses(strHostIP);
                foreach (IPAddress ipaddr in ipadrlist)
                {
                    if (ipaddr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        cbbHostIP.Items.Add(ipaddr.ToString());
                }
                cbbHostIP.Items.Add("127.0.0.1");   // 最后加上回环测试地址
                cbbHostIP.SelectedIndex = 0;
    
                tbHostPort.Text = "8080";
    
                client.OnDataReceived += Client_OnDataReceived;                     // 接收事件函数
                client.OnConnectedSuccessfully += Client_OnConnectedSuccessfully;   // 连接成功事件函数
                client.OnDisconnected += Client_OnDisconnected;                     // 断开连接事件函数
            }
    
            private void Client_OnDisconnected(object sender, STTech.BytesIO.Core.Entity.DisconnectedEventArgs e)
            {
                Print($"客户端已断开({e.ReasonCode})");
                btnConnect.Text = "请求连接";
            }
    
            private void Client_OnConnectedSuccessfully(object sender, STTech.BytesIO.Core.Entity.ConnectedSuccessfullyEventArgs e)
            {
                Print("The server is connected from local " + client.Host + ":" + client.LocalPort);
                btnConnect.Text = "断开连接";
            }
    
            private void Client_OnDataReceived(object sender, STTech.BytesIO.Core.Entity.DataReceivedEventArgs e)
            {
                Print($"Receive Data:{e.Data.EncodeToString("GBK")}");
            }
    
            private void Print(string msg)
            {
                tbRecv.AppendText($"[{DateTime.Now.ToString("yyy-MM-dd HH.mm.ss.fff")}] {msg}\r\n");
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                client.Send(tbSend.Text.GetBytes("GBK"));
            }
    
            private void btnConnect_Click(object sender, EventArgs e)
            {
                if (client.IsConnected == false)
                {
                    client.Host = cbbHostIP.Text;
                    client.Port = int.Parse(tbHostPort.Text);
                    client.Connect();
                }
                else
                {
                    client.Disconnect();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    整个工程的源码上传了CSDN,下载链接如下:

    https://download.csdn.net/download/luobeihai/86239773

  • 相关阅读:
    JS进阶第二篇:函数参数按值传递
    Selenium自动化测试总结
    不规则轮回
    【MYSQL】 三大范式 表的关系 外键 ER图
    Google Earth Engine ——利用降水数据来实现
    Gradle 设置全局镜像源
    学习笔记2--高精度地图定义及价值
    【华为上机真题 2022】矩阵最大值
    嵌入式分享合集91
    tips: r语言排列组合给定vector的特定元素
  • 原文地址:https://blog.csdn.net/luobeihai/article/details/125838000