用于接收和发送的 Udp 客户端不工作
Udp client used for receiving and sendin not working
我成功创建了 UDP 客户端-服务器连接并通过它发送了一张大图像。
我将图像拆分并发送到每个 1500 字节的数据包中。我在另一端收到了 353723 的 330025 字节(我认为这非常好)。但是正如您所知,UDP 数据包不是有序的,所以我必须识别它发送的每个数据包(我不能使用 tcp,因为我的项目游戏需要速度)。现在我想向 'server' 询问丢失的数据包。
这是服务器的代码:
Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding
Public Class Form1
Dim ep_client As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000)
Dim ep_server As New IPEndPoint(IPAddress.Any, 60000)
Dim publisher As New UdpClient(ep_client)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Form2.Show()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sendbytes() As Byte = ASCII.GetBytes(txt1.Text)
Dim img As Image, img_stream As MemoryStream, buffer As Byte()
Dim packet_size As Integer = 1024, sent_size As Long
Try
img_stream = imgToBytes(txt1.Text)
Debug.Print(img_stream.Length)
ReDim buffer(packet_size)
While Not img_stream.Position = img_stream.Length
sent_size += img_stream.Read(buffer, 0, packet_size)
publisher.Send(buffer, buffer.Length)
End While
Debug.Print(100 * sent_size / img_stream.Length & "%")
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
''When I press this button it is supposed to 'listen'
Try
'Silence...Nothing here..
publisher.BeginReceive(New AsyncCallback(AddressOf receive), publisher)
Debug.Print("listening")
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Sub receive(ByVal ar As IAsyncResult)
''It should take the packets from coming from 'any' ip.
publisher.EndReceive(ar, ep_server)
Debug.Print("received")
publisher.BeginReceive(New AsyncCallback(AddressOf receive), publisher)
End Sub
Function imgToBytes(ByVal file_name As String) As MemoryStream
Dim img As Image = Image.FromFile(file_name)
Dim stream As New MemoryStream
img.Save(stream, Drawing.Imaging.ImageFormat.Jpeg)
stream.Position = 0
Return stream
End Function
End Class
这是客户端(成为服务器...)的代码:
Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding
Public Class Form2
Dim ep_server As IPEndPoint = New IPEndPoint(IPAddress.Any, 60000)
Dim ep_client As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000)
Dim client As New UdpClient(ep_client)
Dim stream As New MemoryStream
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
'I belive it's listening for packets comming from ep_client ->
'because I initialized the 'client' object with it
'How can I make it listen for ep_server?(from all ip's)
client.BeginReceive(New AsyncCallback(AddressOf receive), client)
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Public Sub receive(ByVal ar As IAsyncResult)
Dim buffer As Byte()
Try
'Now I use ep_server ->the proper way
buffer = client.EndReceive(ar, ep_server)
stream.Write(buffer, 0, buffer.Length)
client.BeginReceive(New AsyncCallback(AddressOf receive), client)
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
Dim img As Image = Image.FromStream(stream)
Debug.Print(stream.Length)
PictureBox1.Image = img ''Weird image because the packets are not arranged
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Debug.Print("sent")
client.Send(ASCII.GetBytes("a"), 1, ep_client) ''Send something ->not working
End Sub
End Class
没有错误..没有。我可以将图片从服务器发送到客户端,但反之则不行。还有一件奇怪的事。我已将客户端的代码放在另一台机器上...当我在 ep_client 中写入 ipv4(另一台机器的)时出现错误 Dim ep_client As New IPEndPoint(IPAddress.Parse("192.168.1.100"), 60000)
。
我没有错误。如果我像这样初始化服务器和客户端代码上的 'udp-clients':Dim client as new UdpClient(ep_client)
它会出错:
Only one usage of each socket address (protocol/network address/port)
is normally permitted
但是如果我这样写(在服务器端)Dim client as new UdpClient("127.0.0.1",60000)
它没有 error.What 的区别?
问题出在哪里?
你的直接问题是在任何给定时间你只能将一个套接字绑定到一台机器上的端口号 - 所以必须已经有一些东西绑定到端口 60000 才能给你 "Only one usage of each socket address..." 异常 - 也许您的程序的另一个实例已经 运行?
除此之外,我是一名游戏开发人员并且理解使用 UDP 的必要性,在这里 UDP 不是 TCP 的好选择。 UDP 适用于小 "real-time" 数据而不是一次性大数据。如果使用 UDP,您必须担心:可靠性 - 数据报可能根本无法通过,重复 - 数据报可能重复,拥塞控制 - 快速连续发送太多数据报而不检查之前的数据报是否通过只会导致它们被丢弃...真正发送大文件更适合 TCP。
我成功创建了 UDP 客户端-服务器连接并通过它发送了一张大图像。
我将图像拆分并发送到每个 1500 字节的数据包中。我在另一端收到了 353723 的 330025 字节(我认为这非常好)。但是正如您所知,UDP 数据包不是有序的,所以我必须识别它发送的每个数据包(我不能使用 tcp,因为我的项目游戏需要速度)。现在我想向 'server' 询问丢失的数据包。
这是服务器的代码:
Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding
Public Class Form1
Dim ep_client As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000)
Dim ep_server As New IPEndPoint(IPAddress.Any, 60000)
Dim publisher As New UdpClient(ep_client)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Form2.Show()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sendbytes() As Byte = ASCII.GetBytes(txt1.Text)
Dim img As Image, img_stream As MemoryStream, buffer As Byte()
Dim packet_size As Integer = 1024, sent_size As Long
Try
img_stream = imgToBytes(txt1.Text)
Debug.Print(img_stream.Length)
ReDim buffer(packet_size)
While Not img_stream.Position = img_stream.Length
sent_size += img_stream.Read(buffer, 0, packet_size)
publisher.Send(buffer, buffer.Length)
End While
Debug.Print(100 * sent_size / img_stream.Length & "%")
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
''When I press this button it is supposed to 'listen'
Try
'Silence...Nothing here..
publisher.BeginReceive(New AsyncCallback(AddressOf receive), publisher)
Debug.Print("listening")
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Sub receive(ByVal ar As IAsyncResult)
''It should take the packets from coming from 'any' ip.
publisher.EndReceive(ar, ep_server)
Debug.Print("received")
publisher.BeginReceive(New AsyncCallback(AddressOf receive), publisher)
End Sub
Function imgToBytes(ByVal file_name As String) As MemoryStream
Dim img As Image = Image.FromFile(file_name)
Dim stream As New MemoryStream
img.Save(stream, Drawing.Imaging.ImageFormat.Jpeg)
stream.Position = 0
Return stream
End Function
End Class
这是客户端(成为服务器...)的代码:
Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding
Public Class Form2
Dim ep_server As IPEndPoint = New IPEndPoint(IPAddress.Any, 60000)
Dim ep_client As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000)
Dim client As New UdpClient(ep_client)
Dim stream As New MemoryStream
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
'I belive it's listening for packets comming from ep_client ->
'because I initialized the 'client' object with it
'How can I make it listen for ep_server?(from all ip's)
client.BeginReceive(New AsyncCallback(AddressOf receive), client)
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Public Sub receive(ByVal ar As IAsyncResult)
Dim buffer As Byte()
Try
'Now I use ep_server ->the proper way
buffer = client.EndReceive(ar, ep_server)
stream.Write(buffer, 0, buffer.Length)
client.BeginReceive(New AsyncCallback(AddressOf receive), client)
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
Dim img As Image = Image.FromStream(stream)
Debug.Print(stream.Length)
PictureBox1.Image = img ''Weird image because the packets are not arranged
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Debug.Print("sent")
client.Send(ASCII.GetBytes("a"), 1, ep_client) ''Send something ->not working
End Sub
End Class
没有错误..没有。我可以将图片从服务器发送到客户端,但反之则不行。还有一件奇怪的事。我已将客户端的代码放在另一台机器上...当我在 ep_client 中写入 ipv4(另一台机器的)时出现错误 Dim ep_client As New IPEndPoint(IPAddress.Parse("192.168.1.100"), 60000)
。
我没有错误。如果我像这样初始化服务器和客户端代码上的 'udp-clients':Dim client as new UdpClient(ep_client)
它会出错:
Only one usage of each socket address (protocol/network address/port) is normally permitted
但是如果我这样写(在服务器端)Dim client as new UdpClient("127.0.0.1",60000)
它没有 error.What 的区别?
问题出在哪里?
你的直接问题是在任何给定时间你只能将一个套接字绑定到一台机器上的端口号 - 所以必须已经有一些东西绑定到端口 60000 才能给你 "Only one usage of each socket address..." 异常 - 也许您的程序的另一个实例已经 运行?
除此之外,我是一名游戏开发人员并且理解使用 UDP 的必要性,在这里 UDP 不是 TCP 的好选择。 UDP 适用于小 "real-time" 数据而不是一次性大数据。如果使用 UDP,您必须担心:可靠性 - 数据报可能根本无法通过,重复 - 数据报可能重复,拥塞控制 - 快速连续发送太多数据报而不检查之前的数据报是否通过只会导致它们被丢弃...真正发送大文件更适合 TCP。