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窗体的主要内容,如果未能解决你的问题,请参考以下文章