UDP Send and Receive using threads in VB.NET






4.63/5 (47 votes)
Nov 26, 2004
2 min read

494156

47883
This article describes how to send and receive data without making the user interface to halt, in VB.NET using UDP..
Introduction
When I first started with network programming I was unable to get a clean networking project without all the advanced stuff, that is why I'm submitting this. This article introduces how to use UDP/IP to send and receive data between two computers in a network. This also demonstrates the use of threads to send and receive data so that the user interface doesn't get stuck while sending and receiving data. In the receive program there is a cool section which converts the received message to bit format. That is also a simple technique which anybody can understand.
Anybody can use this program in a fair manner. And if you want to add more advanced features feel free to ask. I'm also going to submit a TCP/IP VC++.NET version of this program so that it may be more useful to you.
Background
This program uses UdpClient
to send and receive data. This means that it uses the User Datagram Protocol to communicate. The main advantage of UDP is that it works three times faster than TCP. But beware if you are using an unreliable network, data loss can occur.
Using UDP
When using UDP in VB.NET you must first create a UdpClient
like this. Make sure you import Imports System.Net.Sockets
in the project:
Dim udpClient As New UdpClient
How to send
Dim GLOIP As IPAddress
Dim GLOINTPORT As Integer
Dim bytCommand As Byte() = New Byte() {}
The variables declared above are used in the code below:
GLOIP = IPAddress.Parse(txtIP.Text)
GLOINTPORT = txtPort.Text
udpClient.Connect(GLOIP, GLOINTPORT)
bytCommand = Encoding.ASCII.GetBytes(txtMessage.Text)
pRet = udpClient.Send(bytCommand, bytCommand.Length)
Console.WriteLine("No of bytes send " & pRet)
First of all, we have to assign an IP address to the GLOIP
variable. In VB.NET we use IPAddress.Parse(" ")
to get the IP address from a String
. Of course getting the port is as simple as assigning the value.
Then we use the UdpClient.Connect(hostname as String, port as integer)
to connect.
Then comes the tricky part, converting the string message to the Byte()
format. Once you do this, you just have to use the UdpClient.Send()
method to send the data and it will pass an integer value indicating the number of bytes send.
How to receive
Public receivingUdpClient As UdpClient
Public RemoteIpEndPoint As New _
System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
Public ThreadReceive As System.Threading.Thread
Dim SocketNO As Integer
The variables declared above are used in the code below:
SocketNO = txtSocket.Text
receivingUdpClient = New System.Net.Sockets.UdpClient(SocketNO)
ThreadReceive = _
New System.Threading.Thread(AddressOf ReceiveMessages)
ThreadReceive.Start()
The above code is placed wherever you want to start the receive process. The code starts the thread to receive so that the interface doesn't get stuck by waiting for the receive. The thread assigns ReceiveMessage
function to do the receive process.
Here is the basic coding in the ReceiveMessage
function:
Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIpEndPoint)
txtIP.Text = RemoteIpEndPoint.Address.ToString
Dim BitDet As BitArray
BitDet = New BitArray(receiveBytes)
Dim strReturnData As String = _
System.Text.Encoding.Unicode.GetString(receiveBytes)
This code receives the message. As you can see in the coding the IPEndPoint is configured so that it will receive from any IP address. The receiving port is assigned during the thread calling time.
This also demonstrates the conversion of Byte()
to String
so that you can do whatever you like with the received message.
How to get the bit details
For j = 0 To BitDet.Length - 1
If BitDet(j) = True Then
Console.Write("1 ")
tempStr2 = tempStr
tempStr = " 1" + tempStr2
Else
Console.Write("0 ")
tempStr2 = tempStr
tempStr = " 0" + tempStr2
End If
i += 1
If i = 8 And j <= (BitDet.Length - 1) Then
line += 1
i = 0
TextBox1.Text = TextBox1.Text + tempStr
tempStr = ""
tempStr2 = ""
TextBox1.Text = TextBox1.Text + vbCrLf
If j <> (BitDet.Length - 1) Then
TextBox1.Text = TextBox1.Text + line.ToString & ") "
Console.WriteLine()
End If
End If
Next
This simple code gets the message bit pattern and pastes it in a textbox. Make sure that the Multiline
property of the text box is set to True
.