VB.net应用技巧8: 使用UdpClient完成UDP数据收发

本文介绍了一种使用UdpClient实现UDP数据非阻塞收发的方法,包括初始化UdpClient、启动接收线程、非阻塞接收数据及发送数据等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    前面几篇日志中,介绍了有关UDP的数据收发方法,在UDP技巧3中,发送数据已经使用了UdpClient,但由于接收时,需要非阻塞操作,所以使用了socket方法。随着项目的进展,进一步发现,直接使用UdpClient也可以完成UDP的非阻塞操作,而且程序异常简单,本文就将详细介绍这种UDP数据收发方法。

    1、为了使用UdpClient,我们首先需要引入以下命名空间。

Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

    2、在主窗体中,声明全局变量,以方便各方法函数调用。在声明时,可直接指明本地端口号,例如下面程序我们声明了一个UdpClient对象,并指明自身端口号为929。

Dim udp As New UdpClient(929)

    3、在窗体的加载函数中,启用线程,用于接收UDP数据。如下程序,指明线程的处理函数是thread_udp_receive,并将SocketIsValid变量设置为True,用于告知线程不退出,当窗体结束的时候将SocketIsValid变量设置为False,以结束线程。

SocketIsValid = True
Dim thread As Thread = New Thread(New ThreadStart(AddressOf thread_udp_receive))
thread.Start()

    4、接下来是结束线程处理函数,首先函数从数据库中取得远程IP地址和端口号存于ip_end_point中,然后声明data数组用于接收数据。接下来进入while循环,先判断Available属性,如果该属性为1就表明缓存中有数据,用Receive方法取出,否则就延时100ms,这样就实现了非阻塞操作。

    Private Sub thread_udp_receive()
        Dim ip_end_point As IPEndPoint
        Dim strSQL As String
        Dim rst As ADODB.Recordset
        strSQL = "select * from configuration_net where MINGCHENG = 'configuration_net'"
        rst = myADO.OpenRecordset(strSQL)
        If Not rst.EOF Then
            ip_end_point = New IPEndPoint(IPAddress.Parse(rst.Fields("LocalIP_A").Value & "." & rst.Fields("LocalIP_B").Value & "." & rst.Fields("LocalIP_C").Value & "." & rst.Fields("LocalIP_D").Value), 929)
        Else
            ip_end_point = New IPEndPoint(IPAddress.Parse("192.168.0.1"), 1000)
        End If
        rst.Close()

        Dim data(1024) As Byte
        While True
            If udp.Available > 0 Then
                data = udp.Receive(ip_end_point)
                sub_udp_receive(data, data.Length)
            Else
                common.Delay(100)
            End If
            If SocketIsValid = False Then
                udp.Close()
                Exit While
            End If
        End While
    End Sub

    5、下面是发送函数,这个在应用技巧4中已经介绍过,其基本思路是从数据库中获得远程主机IP地址和端口号,然后准备发送数据,并计算效验和,调用udp.Send函数将其发送出去,并在窗体中完成显示操作。

    Private Sub sub_udp_send(ByRef data() As Byte, ByVal length As Int16)
        Dim ip_end_point As IPEndPoint
        Dim strSQL As String
        Dim rst As ADODB.Recordset
        strSQL = "select * from configuration_net where MINGCHENG = 'configuration_net'"
        rst = myADO.OpenRecordset(strSQL)
        If Not rst.EOF Then
            ip_end_point = New IPEndPoint(IPAddress.Parse(rst.Fields("LocalIP_A").Value & "." & rst.Fields("LocalIP_B").Value & "." & rst.Fields("LocalIP_C").Value & "." & rst.Fields("LocalIP_D").Value), 929)
        Else
            ip_end_point = New IPEndPoint(IPAddress.Parse("192.168.0.1"), 1000)
        End If
        rst.Close()

        Dim i As Int16
        Dim strData As String

        Dim checksum As Int16 = 0
        For i = 0 To length - 1
            checksum = checksum + data(i)
        Next
        data(length) = checksum Mod 256
        udp.Send(data, length + 1, ip_end_point)
        txtCommunicationData.Text = vbCrLf & txtCommunicationData.Text
        strData = "发送(" & TimeOfDay.ToLongTimeString() & “):”
        For i = 0 To length
            strData = strData & " " & common.OneToTwo(Hex(data(i)))
        Next
        txtCommunicationData.Text = vbCrLf & strData & txtCommunicationData.Text
    End Sub

    6、在Me.Disposed方法中将SocketIsValid设置为False,以便完成在窗体退出时,退出线程。

    Private Sub frm_configuration_uart_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
        SocketIsValid = False
    End Sub

    通过以上程序设计,就可以轻松完成UDP的收发操作了。


原创性文章,转载请注明出处
 
优快云:http://blog.youkuaiyun.com/qingwufeiyang12346 






评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snmplink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值