Bild über TCP-Verbindung übertragen

30/04/2009 - 01:26 von Peter Liebig | Report spam
Hallo NG,

ich habe ein paar Dinge aus dem Internet kombiniert und eine
funktionierende TCP/IP Server-Client Kommunikation aufgebaut. Beim Start
baut die erste Instanz einen TCPListener als Server auf und verbindet sich
selbst als Client darauf und wartet dann auf weitere Clients. Der Austausch
von Textnachrichten funktioniert auch einwandfrei. Nun dachte ich mir daß es
doch nicht so schwer sein kann das ganze soweit zu erweitern daß ein Bild
(PictureBox) von einem Client -über den Server- an die anderen Clients
gesendet werden kann.

Die Funktionen zum Senden und Empfangen sehen so aus und werden auch in der
Reihenfolge aufgerufen:

' *** Client sendet an Server ***
Private Sub SendData(ByVal data As String)
SyncLock client.GetStream
Dim writer As New IO.StreamWriter(client.GetStream)
writer.WriteLine(data)
writer.Flush()
End SyncLock
End Sub


' *** Server empfàngt vom Client ***
Private Sub StreamReceiver(ByVal ar As IAsyncResult)
Dim BytesRead As Integer
Static strMessage As String

Try
SyncLock client.GetStream
BytesRead = client.GetStream.EndRead(ar)
End SyncLock

strMessage = Encoding.UTF8.GetString(readBuffer, 0, BytesRead)

Static Buffer As String
Dim msgString As String
msgString = Buffer & strMessage
Buffer = ""
Dim sFeld() As String
sFeld = Split(msgString, Chr(10))
For i As Integer = sFeld.GetLowerBound(0) To
sFeld.GetUpperBound(0)
If Len(sFeld(i)) = 0 Then Exit For
sFeld(i) = Replace(sFeld(i), Chr(13), vbCrLf)
If Strings.Right(sFeld(i), 1) = Chr(10) Then
RaiseEvent LineReceived(Me, Strings.Left(sFeld(i),
Len(sFeld(i)) - 2))
Else
Buffer = Buffer & sFeld(i)
End If
Next

SyncLock client.GetStream
client.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE,
AddressOf StreamReceiver, Nothing)
End SyncLock
Catch e As Exception
End Try
End Sub


' *** Server sendet an Client ***
Public Sub SendData(ByVal Data As String)
SyncLock client.GetStream
Dim writer As New IO.StreamWriter(client.GetStream)
writer.WriteLine(Data)
writer.Flush()
End SyncLock
End Sub


' *** Client empfàngt vom Server ***
Private Sub DoRead(ByVal ar As IAsyncResult)
Dim BytesRead As Integer
Dim strMessage As String

Try
BytesRead = client.GetStream.EndRead(ar)
If BytesRead < 1 Then
MarkAsDisconnected()
Exit Sub
End If

strMessage = Encoding.UTF8.GetString(readBuffer, 0, BytesRead)
Static Buffer As String
Dim msgString As String
msgString = Buffer & strMessage
Buffer = ""
Dim sFeld() As String
sFeld = Split(msgString, Chr(10))
For i As Integer = sFeld.GetLowerBound(0) To
sFeld.GetUpperBound(0)
If Len(sFeld(i)) = 0 Then Exit For
sFeld(i) = Replace(sFeld(i), Chr(13), vbCrLf)
If Strings.Right(sFeld(i), 1) = Chr(10) Then
ProcessCommands(Replace(sFeld(i), vbCrLf, ""))
Else
Buffer = Buffer & sFeld(i)
End If
Next

client.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE,
AddressOf DoRead, Nothing)
Catch ex As System.IO.IOException
MarkAsDisconnected()
Catch ex As Exception
End Try
End Sub


Wie sollte ich nun am besten vorgehen? Die Methoden überladen oder
erweitern?
Wie kann ich das einbauen?
2 Schritte sind auf jeden Fall die Umwandlung in ein Byte-Feld und zurück.

Public Function Image2ByteArray(ByVal Bild As Image, ByVal Bildformat As
System.Drawing.Imaging.ImageFormat) As Byte()
Dim MS As New IO.MemoryStream
Bild.Save(MS, Bildformat)
MS.Flush()
Return MS.ToArray
End Function

Public Function ByteArray2Image(ByVal ByAr() As Byte) As Image
Dim img As Image
Dim MS As New IO.MemoryStream(ByAr)
Try
img = Image.FromStream(MS)
Catch ex As Exception
Return Nothing
End Try
Return img
End Function


Könnt ihr mir weiterhelfen?

Viele Grüße,

Peter
 

Lesen sie die antworten

#1 Armin Zingler
30/04/2009 - 02:08 | Warnen spam
Peter Liebig wrote:
Hallo NG,

ich habe ein paar Dinge aus dem Internet kombiniert und eine
funktionierende TCP/IP Server-Client Kommunikation aufgebaut. Beim
Start baut die erste Instanz einen TCPListener als Server auf und
verbindet sich selbst als Client darauf und wartet dann auf weitere
Clients. Der Austausch von Textnachrichten funktioniert auch
einwandfrei. Nun dachte ich mir daß es doch nicht so schwer sein kann
das ganze soweit zu erweitern daß ein Bild (PictureBox) von einem
Client -über den Server- an die anderen Clients gesendet werden kann.

Die Funktionen zum Senden und Empfangen sehen so aus und werden auch
in der Reihenfolge aufgerufen:

[...]



Ich habe den Code nicht analysiert. Programmierstil ist auch
Geschmackssache. ;-)


Wie sollte ich nun am besten vorgehen? Die Methoden überladen oder
erweitern?



Die SendData-Methode zu überladen scheint ok zu sein.

Wie kann ich das einbauen?



"Kommt darauf an." Auf jeden Fall musst du ein Protokoll festlegen. Der
Empfànger muss ja wissen, ob Text oder Bild ankommt. Im einfachsten Fall
schickst du dem Text eine 1 und dem Bild eine 2 voraus. Anschließend noch
eine Làngenangabe (sonst erkennst du nicht das Ende von Text oder Bild),
dann die Daten. Beim Empfànger dann eben je nach Pràfix (1 oder 2) Text oder
Bild wieder einlesen.

2 Schritte sind auf jeden Fall die Umwandlung in ein Byte-Feld und
zurück. [...]



Oder gleich den Networkstream als Parameter für Bild.Save angeben. Spart den
Umweg über Memorystream und Byte-Array.


Armin

Ähnliche fragen