没有使用异步方法VB.Net接收UDP数据包

时间:2016-04-30 18:14:08

标签: vb.net sockets udp packets

我正在尝试使用UDP通过局域网发送图片。我必须将图片“剪切”成小包,然后在另一端重新组装。到目前为止,我已经制作了服务器和几乎客户端(服务器发送图片)。我已经使用BeginReceive进行了一些测试并且工作(在其他项目上)。现在我在客户端什么都没得到(没有错误......没什么)。这是服务器的代码:

Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding


Public Class Form1
    Dim publisher As New Sockets.UdpClient(0)

    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 = 1500, sent_size As Long


        Try
            publisher.Connect("localhost", 60000)
            img_stream = imgToBytes(txt1.Text)

            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


        Catch ex As Exception
            Debug.Print(ex.Message)
        End Try

    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

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Form2.Show()
    End Sub
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 As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)
    Dim client As New UdpClient(1000)

    Public Event new_msg(ByVal msg As Byte())
    Public Sub client_msg(ByVal msg As Byte())
        Debug.Print("a")
    End Sub

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try      ''don't know why I put this here
            client.BeginReceive(New AsyncCallback(AddressOf receive), client)

        Catch ex As Exception
            Debug.Print(ex.Message)
        End Try
    End Sub

    Sub receive(ByVal ar As IAsyncResult)
        Dim buffer As Byte()
        Debug.Print("b")

        Try
            buffer = client.EndReceive(ar, ep)
            ''RaiseEvent new_msg(buffer)

            client.BeginReceive(New AsyncCallback(AddressOf receive), client)
        Catch ex As Exception
            Debug.Print(ex.Message)
        End Try
    End Sub

End Class


问题出在哪里?

1 个答案:

答案 0 :(得分:1)

您的问题是您的客户端没有通过同一端口进行通信。

Form2你做:

Dim client As New UdpClient(1000)

然后在Form1连接时执行:

publisher.Connect("localhost", 60000)

将端口更改为1000,它可以正常工作:

publisher.Connect("localhost", 1000)