C#制作UDP协议可同时收发Winform窗体

Posted T'yi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#制作UDP协议可同时收发Winform窗体相关的知识,希望对你有一定的参考价值。

 首先启动Visual Studio(以2017版为例):

新建一个点击新建一个项目

找到C#的Windows窗体应用项目,可以在下方更改项目名称和存储路径:

解决方案名称和.net框架默认的就可以

创建成功后:

首先在视图里面打开工具箱:

点击后就可以看到工具箱:

在控件中找到TextBox:

按住鼠标左键拖到Form窗体上

再拖出一个TextBox到窗体(方法如上)

然后拖出两个Label:

再拖出一个button

最后界面:

点击label1,在右下方的属性中找到Text属性,修改成“要发送的数据:”

再把label2的Text属性改为“接收到的数据:”

再点击其中一个TextBox:

从属性里找到Multiline属性,该属性默认False,点击该属性右边朝下箭头选择True:

再看界面上的TextBox,发现可以调整上下长度,自己根据喜好进行调整大小,然后布局一下:

再调整一下另一个TextBox的Multiline属性

最后布局:

最后还要修改一下button的Text属性,改成“发送”:

这样一个简单的界面就制作完成,接下来就是对界面编程了

双击窗体空白部分进入程序:

在Form1的构造函数上面添加:

static UdpClient udp = new UdpClient(8998);

这里创建一个Sockets端口号为8998   该端口是接收数据的端口可以自行更改

点击UdpClient,点击显示可能的修补程序,点击using System.Net.Sockets;

这样包含了Sockets的命名空间就不会再报错了

在Form1的构造函数内添加

 CheckForIllegalCrossThreadCalls = false;//在其他线程中可以调用主窗体控件

如图所示:

接下来创建一个线程:

 Thread js = new Thread(()=>
{

});
            

这里可能Thread会报错,点开可能的修补程序:

选择 using System.Threading;  这样就不会报错了

在线程的构造函数里添加:   这是后面Receive方法所需要的参数

IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, 8998); //创建IPEndPoint对象,用来显示响应主机的标识

可能IPEndPoint会显示错误 还是命名空间的问题 点击显示可能修补的程序添加命名空间即可

接下来就是接收消息过程:

while (true)
                {
                    try
                    {
                        if (udp.Available <= 0) continue;//判断是否有网络数据
                        if (udp.Client == null) return;//判断连接是否为空
                                                       //调用UdpClient对象的Receive方法获得从远程主机返回的UDP数据报
                        byte[] bytes = udp.Receive(ref ipendpoint);
                        //将获得的UDP数据报转换为字符串形式
                        string str = Encoding.Default.GetString(bytes);
                        //textBox2.Text = "正在接收的信息:\\n" + str;//显示正在接收的数据
                        textBox2.Text += "\\n" + str;//显示接收的所有数据

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);//错误提示
                    }
                    Thread.Sleep(2000);//线程休眠2秒
                }

这里大家可以根据注释自己理解一下 

在后面再添加一句: 开启线程

js.Start();

至此,接收部分的功能就已经实现:

接下来就是实现发送功能:

因为是要点击发送按钮才进行发送数据,所以我们在按键的点击事件函数中实现发送功能:

首先回到界面,双击Button按键进入Button的点击事件函数:

该函数会在Button被点击后系统调用

因为已经在创建了一个全局的UdpClient对象

所以在这里可以直接调用:

udp.Connect("127.0.0.1", 8888);

这个方法有点像是TCP的连接对方Sockets,参数输入对方的IP和端口

接下来就是发送数据了:

Thread fs = new Thread(() =>
            {
                while (true)
                {
                    try
                    {
                        if (textBox1.Text != null)
                        {
                            Byte[] sendBytes = Encoding.Default.GetBytes(textBox1.Text);
                            udp.Send(sendBytes, sendBytes.Length);
                        }
                    }

                    catch
                    {
                        break;
                    }
                }
            }
            );
            fs.Start();

创建一个新线程  首先判断textBox里面是否有东西,如果有东西就对内容进行编码,然后使用Send发送出去

到这里就已经实现了发送和接收功能,我们运行试验一下结果:

结果是正确的

这里如果觉得接收数据显示的格式不好看可以在js线程的参数里进行修改

该程序只是简单实现UDP的数据收发,不是非常完善,有兴趣可以再添加两个TextBox来输入IP和端口,这样程序就更实用。

以上是关于C#制作UDP协议可同时收发Winform窗体的主要内容,如果未能解决你的问题,请参考以下文章

C#制作UDP协议可同时收发Winform窗体

C#制作UDP协议可同时收发Winform窗体

C# winform 制作圆形窗体

C# winform中制作不规则透明窗体

C#在winform窗体中怎么制作把方形按钮控件变成圆形的啊

UDP 特点