Hi,
ich hab ein Projekt in C#, das über
TCP als Client mit einem Server kommuniziert. Wenn ich dem Server nun beispielsweise ein Kommando sende, dann schickt dieser mir das, was ich mit diesem Kommando anfordere. Quasi das Ping-Pong-Prinzip. Das kann ein riesiger Datensatz sein oder nur die Uhrzeit.
Mit den normalen System.Net.Socket's / TcpClient funktioniert das auch wunderbar, solang bekannt ist, wieviel der Server bei einer bestimmten Anfrage sendet.
Nun gibt es hier ein Problem. Auf ein Request des Clients können auch mal 2-3 Antworten total unterschiedlicher Länge vom Server kommen. Zwischen diesen Antorten kann - der Server ist sehr komplex und hat in Hochzeiten auch viel zu tun - auch durchaus mal eine längere Zeitspanne liegen.
Ich hab es jetzt schon gelöst, nur is die Lösung wirklich sehr quick und verdammt dirty
Aufbau ist wie folgt (Pseudo):
Code:
TcpClient
tcp = new TcpClient();
NetworkStream str =
tcp.GetStream();
BinaryReader reader = new BinaryReader(str);
BinaryWriter writer = new BinaryWriter(str);
...
byte[] dummy = new byte[1];
String buffer = "";
do
{
reader.read(dummy,0,1);
buffer += B2S(dummy); //B2S = Byte[]ToString, eigene Funktion, funktioniert auch
} while (! buffer.contains(ENDKOMMANDO))
Dabei mache ich mir die Eigenschaft zunutze, dass der Server bei jedem Antworten-Paket ein bestimmtes Kommando am Ende sendet. Quasi ein "das wars, dass sind die Daten zu deinem Request". Ich hab deswegen einfach eine Schleife gemacht die solange "empfängt", bis der empfangene String auch das Abbruchkommando enhält.
Allerdings gibts daher auch 100% Auslastung.
Gibt es nicht irgendeine Möglichkeit quasi ein Client-Listener zu machen, vll ne Callback-Funktion die automatisch horcht ob Daten vom Server kommen?
Danke im Voraus und schönen Feiertag
Philipp F.