vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

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

VB.NET - Ein- und Umsteiger
Networkstream mit Events? 
Autor: Ryo
Datum: 31.08.12 10:19

Halloo!

Erledigt ... ich habe die ganze Zeit stream.DataAvaiable übersehen

Ich habe ein Problem mit der Implementierung der Serverseite einer Netzwerkapplikation.

Die bisherige Lösung sieht so aus:
Thread 1 wartet auf eingehende Verbidungen:

'Server Threadfunktion
server = New TcpListener(ipendpoint)
server.Start()
 
While bServerRunning ' Verbindungen annehmen sollange Server läuft
 
   Try
 
      'Neues Clientobjekt erstellen und zum Dictionary für verbundene Clients 
      ' hinzufügen
      connectedClients.Add(iNextID, New cConnectedClient( _
        server.AcceptTcpClient, iNextID))
 
      iNextID = iNextID + 1 'ID erhöhen
 
 
      Catch e As Exception
         '...
      End Try
 
End While
connectedClients ist hierbei ConcurrentDictionary(uint64, cConnectedClient)

cConnectedClient ein Klasse deren Objekte verbundene Clients entsprechen.
cConnectedClients startet nun nach dem Instanzieren einen Thread der den Networkstream des zugrundeliegenden TcpClient überwacht, eingehende Pakete von diesem ließt und auswertet, also ca so:

'Auf eingehende Pakete warten
While m_bClientRunning
 
   Try
 
      'Überprüfen ob Client weiterhin verbunden ist
      If m_tcpClient.Connected = False Then
         consoleOutput("Client getrennt")
         m_bClientRunning = False
      Else
 
         'An dieser Stelle Read() vom Networkstream des TcpClients lesen und 
         ' Daten behandeln
 
      End If
 
   Catch e As Exception ' die aktuelle überwachte verbindung hat sich wohl 
   ' verabschiedet.
 
      m_bClientRunning = False
 
   End Try
 
End While
 
'cConnectedClient-Objekt auflösen
shutdownClient()
Es wird also für jeden Verbundenen Client ein Thread erstellt. Das funktioniert zwar bis zu einer gewissen Zahl Verbindungen, finde ich persönlich aber recht unsauber. Lieber wäre mir ein Producer-Consumer-Szenario bei dem:
1. Verbundene X Clients in eine Datenstruktur dsClients eingefügt werden
2. Y dedizierte Threads behandeln eingehenden Netzwerkverkehr der Clients wobei Y < X sein soll.
3. Y dedizierte Threads schreiben die gelesenen Datenpakete in eine Queue dsPakets
4. Z dedizierte Threads behandeln die Datenpakete aus dsPakets.

Mein Problem liegt Momentan in Punkt 1 und 2. Da Networkstream.Read() blockiert Daten eingehen oder der Streamgeschlossen wird (oder Timeouted und dabei leider auch TcpClient.Connected = "False" setzt). Nach meinem Kentnissstand ist es daher unabdingbar auf jeden Stream einen Thread "zu setzen" der da wartet bis etwas passiert.

Gibt es eine Möglichkeit mittel Events oder ähnliches zu Signalisieren wenn Daten auf einem Stream vorliegen oder etwas anderes passiert so dass man mit einem kleinen Threadpool viele bestehende Verbindungen überwachen kann?

Danke im Vorraus!

Beitrag wurde zuletzt am 31.08.12 um 10:31:42 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Networkstream mit Events?1.134Ryo31.08.12 10: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-2024 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