当前位置:   article > 正文

2.6-使用C#Winform开发Tcp/Udp网络小助手(含步骤和源码)_winfrom 中好用的tcp框架

winfrom 中好用的tcp框架

一、界面设计

在做软件之前使用“软件界面设计工具”先设计并绘制出软件界面,方便在写代码之前确认“功能需求”以及“交互流程”。
这里使用的软件是:“Axure RP”
在这里插入图片描述

二、新建工程与绘制界面

  1. 新建工程:
    使用任意一个Visual studio即可,这里使用Visual studio2017作为开发环境(安装的时候选择.net桌面开发)。新建工程选择“c# winform类型的工程,然后填写工程名字即可完成工程创建”。

  2. 绘制图形界面:
    鼠标单击打开“From1.cs”文件,会出现界面绘制界面。点击软件左侧栏的“工具栏”弹出界面控件列表,选择要绘制的控件拖动到软件绘制界面,并调整控件位置,直到达到设计图所设计的样子。如下图所示:
    在这里插入图片描述

  3. 添加按钮按下相应函数:
    选中按钮并使用右键点击“属性”,从而打开这个按钮的属性配置窗口,在窗口里可以设置很多属性,切换到事件配置页面(闪电图标)即可编辑与此控件相关的事件。在“事件配置页面”即可给按钮添加点击事件响应函数,如下图所示:
    在这里插入图片描述

三、用到的库函数说明

.net提供了串口编程函数类,为了避免把逻辑代码和界面代码混合编写。这里给串口相关操作函数做了二次封装(采用类似工厂模型建立)。界面代码只要调用二次封装的类即可完成网络通信。

  1. Udp broadcast
UdpClient { //.net提供的类
    UdpClient();//新建对象即可使用,没有Open函数
    bool EnableBroadcast { get; set; }//设置允许广播
    void Close();//关闭对象相关资源
    int Send(byte[] dgram, int bytes, IPEndPoint endPoint);//发送udp数据包,参数(数据,目标ip,目标端口)
    int Available { get; }//是否有数据可读
    byte[] Receive(ref IPEndPoint remoteEP);//读取数据(阻塞函数),开启一个线程循环调用此函数读取
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. Udp client
UdpClient {//.net提供的类
    UdpClient();//新建对象即可使用,没有Open函数
    void Close();//关闭对象相关资源
    int Send(byte[] dgram, int bytes, IPEndPoint endPoint);//发送udp数据包,参数(数据,目标ip,目标端口)
    int Available { get; }//是否有数据可读
    byte[] Receive(ref IPEndPoint remoteEP);//读取数据(阻塞函数),开启一个线程循环调用此函数读取


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. Udp server
UdpClient {//.net提供的类
    UdpClient(int port);//新建对象即可使用,没有Open函数,建立udp服务端需要在构造函数输入“监听端口”
    void Close();//关闭对象相关资源
    int Send(byte[] dgram, int bytes, IPEndPoint endPoint);//发送udp数据包,参数(数据,目标ip,目标端口)
    int Available { get; }//是否有数据可读
    byte[] Receive(ref IPEndPoint remoteEP);//读取数据(阻塞函数),开启一个线程循环调用此函数读取


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. Tcp client
TcpClient {//.net提供的类 
    void Connect(IPAddress address, int port);//开始向服务端连接,参数:服务器ip,服务器端口
    NetworkStream GetStream();获取网络通信流,用这个流来最终完成数据收发
    void Close();///关闭相关资源
}
NetworkStream {//.net提供的类 
    void Write(byte[] buffer, int offset, int size);//写数据
    int Read(byte[] buffer, int offset, int size);//收数据
    void Close();关闭流
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. Tcp server
TcpListener {//.net提供的类 
    TcpListener(IPEndPoint localEP);//参数传入监听端口
    void Start();//开始监听
    IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, object state);//开始监听客户端的连接请求,在毁掉函数中处理连接请求
    TcpClient EndAcceptTcpClient(IAsyncResult asyncResult);//暂停监听客户端请求,并返回一个刚刚建立的通信的TcpClient, 之后使用TcpClient来完成对这个连接的数据收发。
    NetworkStream GetStream();//获取网络通信流,用这个流来最终完成数据收发
    void Close();//关闭相关资源
}
NetworkStream {//.net提供的类 
    void Write(byte[] buffer, int offset, int size);//写数据
    int Read(byte[] buffer, int offset, int size);//收数据
    void Close();//关闭流
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

四、核心编写逻辑代码

  1. 打开与关闭的逻辑
//经过简化的代码
private void ButtonOpen_Click(object sender, EventArgs e)
        {
            if (netManager.IsOpen()) //IsOPen
            { //do close
                netManager.Close();
            }
            else
            { //do open
                string des_ip = textBoxNetDesIp.Text;
                string des_port = textBoxNetDesPort.Text;
                //net type
                int index = comboBoxNetType.SelectedIndex;
                CommNetType.NetType netType = NetManager.GetNetTypeByIndex(index);
                int port = int.Parse(des_port);
                netManager.Open(netType, des_ip, port);
            }
        }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  1. 发送数据逻辑
//经过简化的代码
 private void ButtonSend_Click(object sender, EventArgs e)
        {
            string send_str = textBoxNetSend.Text;
            if (checkBoxNetSendHex.Checked)
            {
                byte[] data = HexFormatUtils.String2HexByte(send_str);
                netManager.Send(data);
            }
            else
            {
                Encoding encodingGB2312 = Encoding.GetEncoding("gb2312");
                Byte[] byte_array = encodingGB2312.GetBytes(send_str.ToCharArray());
                netManager.Send(byte_array);
            }
        }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. 接收数据逻辑
 private void OnNetRecvListener(byte[] data, int length, IPEndPoint iped) {
            if (checkBoxNetRecvHex.Checked)
            {
                BeginInvoke(new MethodInvoker(delegate
                {
                    AddRecvMsg(HexFormatUtils.HexByte2String(data));
                }));
            }
            else
            {
                BeginInvoke(new MethodInvoker(delegate
                {
                    Encoding encodingGB2312 = Encoding.GetEncoding("gb2312");
                    Char[] c_data = encodingGB2312.GetChars(data);
                    string str = new String(c_data);
                    AddRecvMsg(str);
                }));
            }
        }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

五、获取源代码

点击此链接获取源代码

六、效果图

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/583649
推荐阅读
相关标签
  

闽ICP备14008679号