因此,我创建了一个UDP服务器/客户端聊天程序。显然,从客户端向服务器发送数据是可以的。但是,只有当我使用专用IP来设置服务器时,才能从服务器向客户端发送数据。如果我使用公共IP,则无法再从服务器向客户端发送数据。最奇怪的是,昨天我使用了我的公共IP并成功了。但是现在没有。
客户端
Dim publisher As New Sockets.UdpClient()
Dim serverEP As IPEndPoint
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
serverEP = New IPEndPoint(IPAddress.Parse(TBTo.Text), TBPort.Text)
publisher.Connect(serverEP)
publisher.Client.Blocking = False
Me.Text = serverEP.ToString
Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim sendbytes() As Byte = ASCII.GetBytes("Hi Server")
publisher.Send(sendbytes, sendbytes.Length)
Try
Dim rcvbytes() As Byte = publisher.Receive(serverEP)
Dim rcvedData As String = ASCII.GetString(rcvbytes)
'Dim rcvdata = publisher.Receive(serverEP)
Me.Text = rcvedData
Catch ex As Exception
End Try
End Sub
服务器端
Dim subscriber As UdpClient = New UdpClient(5823)
Dim clientEP As IPEndPoint
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sendbytes() As Byte = ASCII.GetBytes("Hi Client")
subscriber.Send(sendbytes, sendbytes.Length, clientEP)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
subscriber.Client.ReceiveTimeout = 100
subscriber.Client.Blocking = False
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5823)
Try
Dim rcvbytes() As Byte = subscriber.Receive(ep)
TBRcv.Text = ASCII.GetString(rcvbytes)
clientEP = ep
Catch ex As Exception
End Try
End Sub
我希望服务器将数据以公共IP发送给客户端。我试图使服务器将数据连续发送到客户端,并在客户端上创建了一个按钮以将数据转换为字符串,但它使我犯了这个错误:System.Net.Sockets.SocketException:'非阻塞套接字操作可以不能立即完成”