2016-04-30 5 views
0

              Ich versuche, ein Bild über lan mit UDP zu senden. Ich muss das Bild in kleine Pakete "schneiden" und am anderen Ende wieder zusammensetzen. Bisher habe ich den Server und fast den Client gemacht (der Server sendet das Bild). Ich habe einige Tests mit BeginReceive gemacht und gearbeitet (an anderen Projekten). Jetzt bekomme ich nichts auf den Client (kein Fehler ... nichts). Hier ist der Code für den Server:keine UDP-Pakete empfangen mit Asynchron-Methode VB.Net

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 

Der Kunde ist auf der zweiten Form:

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 


              Wo liegt das Problem?

+0

Haben Sie trat durch Ihren Code mit Breakpoints? –

+0

Nein ... ich glaube nicht, dass ich etwas bekommen werde..Ich gebe Drucke überall ... nichts –

+0

Über Haltepunkte können Sie bekommen, wo Ihre Anwendung die Ausführung von Code beendet. Ich versuche gerade deinen Code. Obwohl ich nicht anders kann, als zu bemerken, dass Sie nichts mit den Daten tun, die Sie erhalten, also was ist wirklich das Problem? –

Antwort

1

Ihr Problem besteht darin, dass Ihre Clients nicht über denselben Port kommunizieren.

In Form2 Sie tun:

Dim client As New UdpClient(1000) 

dann in Form1, wenn Sie verbinden Sie tun:

publisher.Connect("localhost", 60000) 

Ändern, um den Hafen zu 1000 und es funktioniert:

publisher.Connect("localhost", 1000) 
+0

Es hat funktioniert. Allerdings verstehe ich etwas nicht. Warum muss ich beim Erstellen einer neuen Instanz des udpClients den Port angeben, wenn ich am Ende einen ipEndPoint verwende, der den Port bereits enthält? Es gibt noch eine weitere seltsame Sache: Ich habe den Port in 'Dim client As New UdpClient (1000) 'gelöscht und' Dim client As New UdpClient (ep) 'gesetzt. Da der Port der EP auf 60000 eingestellt war, funktionierte dies (wie folgt: Dim ep als IPEndPoint = New IPEndPoint (IPAddress.Any, 60000)). Aber ich weiß, dass 0 jeden Port bedeutet. Mit 'Dim ep als IPEndPoint = Neuer IPEndPoint (IPAddress.Any, 0)' funktioniert es nicht. Warum? –

+0

@sergiu: Bitte definieren Sie "funktioniert nicht". –

+0

Wenn ich den Code wie folgt neu schreiben Dim ep als IPEndPoint = New IPEndPoint (IPAddress.Any, 60000) Dim-Client als neue UdpClient (ep) 'alles funktioniert gut. Aber mit dem 'universellen' Port (0) empfängt es kein Paket: 'Dim ep als IPEndPoint = Neuer IPEndPoint (IPAddress.Any, 0) Dim Client Als neuer UdpClient (ep) ' –

Verwandte Themen