Vb.net UDP本地广播
我在做一个遥控工具。客户端运行一个程序,在本地向服务器发送命令以控制它们 但是,客户端不知道服务器的IP地址,反之亦然 我决定使用UDP广播(请告诉我是否有更好的方法,我尝试过使用多播,但我并不真正理解它)。启动时,客户端(控制服务器)会广播一条消息,告诉服务器新客户端已连接。然后(或服务器启动时),服务器广播自己的IP地址。当客户端收到IP地址时,它会尝试通过TCP进行连接 不幸的是,我遇到了问题。我随机得到Vb.net UDP本地广播,vb.net,udp,broadcast,multicast,udpclient,Vb.net,Udp,Broadcast,Multicast,Udpclient,我在做一个遥控工具。客户端运行一个程序,在本地向服务器发送命令以控制它们 但是,客户端不知道服务器的IP地址,反之亦然 我决定使用UDP广播(请告诉我是否有更好的方法,我尝试过使用多播,但我并不真正理解它)。启动时,客户端(控制服务器)会广播一条消息,告诉服务器新客户端已连接。然后(或服务器启动时),服务器广播自己的IP地址。当客户端收到IP地址时,它会尝试通过TCP进行连接 不幸的是,我遇到了问题。我随机得到一个现有连接被远程主机强制关闭异常,我无法找出原因。 侦听UDP广播时,我的客户端程序
一个现有连接被远程主机强制关闭异常,我无法找出原因。
侦听UDP广播时,我的客户端程序发生异常
现在,我正在寻找一种更好的方式来找到客户。
我应该使用广播还是多播?
我将如何实现这一点
编辑:使用多个端口不会有问题。但是,我需要能够在一台计算机上运行客户端和服务器
这是我使用的代码
客户端(控制服务器)
服务器(由客户端控制)
提前谢谢 我建议使用zerocconf查找服务器和客户端,然后使用TCP套接字在两者之间进行通信。您可以在此处看到键值对zeroconf公告的示例实现:谢谢您的回答。我通过删除在我的客户端中手动调用StartBroadcastUdpThread()
的功能来修复它
我仍然不明白为什么会发生这种情况。我对客户端和服务器使用完全相同的代码,只是端口被交换了。即使多次调用StartBroadcastUdpThread()
方法,TCP服务器也不会崩溃,客户端会崩溃。顺便说一句,不管是先启动客户机还是服务器,都会出现问题
即使我真的不明白为什么第二次广播会阻止客户端接收广播,但现在已经解决了。谢谢你的帮助 最小UDP服务器基础:
Imports System.Threading
Shared client As UdpClient
Shared receivePoint As IPEndPoint
client = New UdpClient(2828) 'Port
receivePoint = New IPEndPoint(New IPAddress(0), 0)
Dim readThread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets))
readThread.Start()
Public Shared Sub WaitForPackets()
While True
Dim data As Byte() = client.Receive(receivePoint)
Console.WriteLine("=" + System.Text.Encoding.ASCII.GetString(data))
End While
End Sub
你在两台机器上都检查过防火墙设置了吗?我用一台计算机进行了测试,防火墙设置很好。我甚至完全禁用了防火墙。顺便说一句,连接确实有效,我能够正确接收所有广播,它只是在第二次广播后断开我的连接。
'Variables
Private UdpBroadcaster As UdpClient
Private UdpBroadcasterEndpoint As New IPEndPoint(IPAddress.Broadcast, 4333)
'Main method
Public Sub Main()
Try
UdpBroadcaster = New UdpClient(4334)
UdpBroadcaster.EnableBroadcast = True
StartUdpListener()
StartBroadcastUdpThread()
Catch
Console.WriteLine("Failed to create server. Port already in use?")
End Try
End Sub
'Called in Main()
Private Sub StartUdpListener()
Dim ListenerUdp As New Thread(AddressOf UdpListener)
ListenerUdp.IsBackground = True
ListenerUdp.Start()
End Sub
'Started as thread in StartUdpListener()
Private Sub UdpListener()
Try
Do
Dim ReceivedBytes() As Byte = UdpBroadcaster.Receive(UdpBroadcasterEndpoint)
Dim ReceivedString As String = System.Text.Encoding.UTF32.GetString(ReceivedBytes)
If ReceivedString.Equals("Client-Identify") Then
StartBroadcastUdpThread()
End If
Loop
Catch
If Not UdpBroadcaster Is Nothing Then
UdpBroadcaster.Close()
End If
End Try
End Sub
'Called when the application is started or a "Client-Identify" command is received
Private Sub StartBroadcastUdpThread()
Dim UdpBroadcastThread As New Thread(Sub() BroadcastUdp())
UdpBroadcastThread.IsBackground = True
UdpBroadcastThread.Start()
End Sub
'Started as thread in StartBroadcastUdpThread()
Private Sub BroadcastUdp()
Dim BroadcastBytes() As Byte = System.Text.Encoding.UTF32.GetBytes(Dns.GetHostName)
UdpBroadcaster.Send(BroadcastBytes, BroadcastBytes.Length, UdpBroadcasterEndpoint)
End Sub
Imports System.Threading
Shared client As UdpClient
Shared receivePoint As IPEndPoint
client = New UdpClient(2828) 'Port
receivePoint = New IPEndPoint(New IPAddress(0), 0)
Dim readThread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets))
readThread.Start()
Public Shared Sub WaitForPackets()
While True
Dim data As Byte() = client.Receive(receivePoint)
Console.WriteLine("=" + System.Text.Encoding.ASCII.GetString(data))
End While
End Sub