vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Re: GELÖST NetworkStream - Bestätigung senden 
Autor: Preisser
Datum: 15.08.12 22:12

Hallo,

den Code verstehe ich nicht ganz. StreamReader.Peek() gibt doch nur -1 zurück, wenn das Ende des Streams erreicht ist bzw. ein anderer Fehler aufgetreten ist - also beim NetworkStream, wenn die Verbindung vom anderen PC geschlossen wurde (das hatte ich bei deinem letzten Beitrag nicht genau angesehen - sorry). Wenn kein weiteres Zeichen im Puffer ist, blockiert die Methode.

Wenn das der Fall ist, sollte es aber auch funktionieren, in einer Schleife solange MyStreamReader.ReadLine() aufzurufen, bis irgendwann Nothing (null) zurückgegeben wird (es ist ziemlich ineffizient jedes Byte einzeln zu lesen, in ein Character umzuwandeln und an einen String anzuhängen).

Allerdings müsste man dann ja wieder neue Verbindungen annehmen, da die alte geschlossen wurde. Also z.B. wenn jeder TCP-Verbindung in einem eigenen Thread verarbeitet werden soll (hier wird Windows-1252 als Kodierung verwendet):
    Private Sub StartServerRead()
        Dim listener As New TcpListener(MyIPEndpoint)
        listener.Start()
 
        While True
            Dim client As TcpClient = listener.AcceptTcpClient()
 
            ' Verbindung in neuem Thread verarbeiten
            Dim thread As New Thread( _
                Sub()
                    HandleTcpClient(client)
                End Sub)
            thread.Start()
        End While
    End Sub
 
    Private Sub HandleTcpClient(client As TcpClient)
        Using client
            Using stream As NetworkStream = client.GetStream()
                Dim myStreamReader As New StreamReader(stream, _
                  Encoding.GetEncoding(1252))
                Dim myStreamWriter As New StreamWriter(stream, _
                Encoding.GetEncoding(1252))
 
                ' Solange Zeilen lesen, bis Gegenüber die Verbindung trennt
                While True
                    Dim line As String = myStreamReader.ReadLine()
                    If line Is Nothing Then Exit While 'Stream-Ende
 
                    'Zeile verarbeiten...
                    Debug.WriteLine("Zeile: " & line)
                End While
 
                ' Antwort senden und Verbindung trennen
                myStreamWriter.WriteLine("Quittung")
                myStreamWriter.Flush()
            End Using
        End Using
    End Sub
Bei ReadLine() sollte man allerdings sicherstellen, dass nur berechtigte Clients sich verbinden können, da sonst evtl. jemand einen DoS provozieren könnte, indem er lauter Zeichen ohne Zeilenumbruchzeichen sendet (dann wird irgendwann eine OutOfMemoryException geworfen). Oder man benutzt ein Char-Array als Buffer und sucht darin dann manuell nach den Zeilenumbrüchen, unter Verwendung einer max. Zeilenlänge.

Beitrag wurde zuletzt am 15.08.12 um 22:34:36 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
NetworkStream - Bestätigung senden1.893MEGAtrash13.08.12 21:52
Re: NetworkStream - Bestätigung senden1.442Preisser13.08.12 22:28
Re: NetworkStream - Bestätigung senden1.661MEGAtrash13.08.12 22:45
Re: NetworkStream - Bestätigung senden1.429Preisser14.08.12 00:04
Re: NetworkStream - Bestätigung senden1.430MEGAtrash14.08.12 22:02
Re: NetworkStream - Bestätigung senden1.487Preisser14.08.12 22:33
GELÖST NetworkStream - Bestätigung senden1.384MEGAtrash15.08.12 21:20
Re: GELÖST NetworkStream - Bestätigung senden1.481Preisser15.08.12 22:12
Re: NetworkStream - Bestätigung senden1.388MEGAtrash15.08.12 22:44
Re: NetworkStream - Bestätigung senden1.381MEGAtrash16.08.12 21:14
Re: NetworkStream - Bestätigung senden1.401MEGAtrash25.08.12 19:19

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel