Hallo,
ich hoffe mir kann hier einer weiter helfen. Ich habe eine Server und eine Client Anwendung. Die Serveranwendung verarbeitet Daten, speichert diese in einer Klasse, serialisiert diese und schickt sie per TCPIP an den Client. Das Serialisieren und verschicken klappt einwandfrei.
Nur wie kann ich sicherstellen, dass die Clientanwendung die Daten erst dann serialisiert wenn sie komplett angekommen sind? (Datenfragmente)
Ich hab mir jetzt gedacht das die zu schickenden Daten so aussehen. Die ersten 4 Bytes beinhalten die komplette Länge des Objekts. Beim Client werte ich die ersten 4 Bytes aus und weiß dann wie lange der String sein soll.
Nur bekomm ich es zum teufel nicht hin so lange zu warten bis alle Daten da sind. Ich mein die Länge des Objekts lese ich bereits erfolgreich aus auf dem Client. Nur liefert mir die Funktion Sockets.EndReceive oft mehr Bytes zurück als ankommen können. Wie macht man so was normalerweise? Muss doch einfacher gehen????
Hier mal der Versuch beim Client wie ich die Empfangenen Daten auslesen will. Vielleicht hab ich ja hier einen Fehler.
Private KompletteLaenge As Integer = 0
Private mEmpfangeneLaenge As Integer = 0
Private mKomplettesObjektalsByteAktuellePosition As Integer
Private mReceiveBuffer(1023) As Byte
Private mKomplettesObjektalsBytes(-1) As Byte
Private Sub BeginReceive(ByVal ar As System.IAsyncResult)
mEmpfangeneLaenge = mClientSocket.EndReceive(ar)
'Anzahl der Bytes holen, die kommen
If KompletteLaenge = 0 Then 'FirstFrame
KompletteLaenge = mReceiveBuffer(0)
KompletteLaenge += CInt(mReceiveBuffer(1)) << 8
KompletteLaenge += CInt(mReceiveBuffer(2)) << 16
KompletteLaenge += CInt(mReceiveBuffer(3)) << 24
ReDim mKomplettesObjektalsBytes(KompletteLaenge - 1)
Array.Copy(mReceiveBuffer, 4, mKomplettesObjektalsBytes, _
mKomplettesObjektalsByteAktuellePosition, mEmpfangeneLaenge - 5)
End If
mKomplettesObjektalsByteAktuellePosition += mEmpfangeneLaenge - 1
Array.Copy(mReceiveBuffer, 4, mKomplettesObjektalsBytes, _
mKomplettesObjektalsByteAktuellePosition, mEmpfangeneLaenge - 5)
mClientSocket.BeginReceive(mReceiveBuffer, 0, 1023, _
Net.Sockets.SocketFlags.None, AddressOf BeginReceive, mClientSocket)
If mKomplettesObjektalsByteAktuellePosition = KompletteLaenge - 1 Then
KompletteLaenge = 0
RebuildList()
End If
End Sub |