Hi
Hab da ein kleines Problem.
Arbeite im Moment an einem Client/Server-Programm. Für die Kommunikation habe ich ein eigenes Protokoll entwickelt (über TCP/IP) das sehr ähnlich dem HTTP ist. Dazu habe ich einen Satz von Message-Klassen definiert um die einzelnen Kommandos sauber zu kapseln. Diese Messages werden dann zwischen den Clients und dem Server ausgetauscht bzw. gesendet ;-). Aus den Messages erzeuge ich dann ein Byte-Array und sende diesen Array über den OutputStream.
Die Messages sind wie folgt aufgebaut:
| ClientID (1 Byte) | Type (1 Byte) | Length (4 Byte) | Data (N Bytes) |
Dies funktioniert soweit so gut. Das Problem beginnt bei hoher Last, wenn viele Clients viele Messages senden. Auf der Server-Seite (und natürlich auch auf der Client-Seite) lese ich die Bytes aus dem Socket mit
. Das heisst, zuerst wird nur der Header (Total 6 Bytes) ausgelesen danach anhand des
Length-Feldes die Daten-Bytes. Ich muss bei dieser Methode davon ausgehen, dass ich immer auch wirklich den Header auslese und nicht sonstigen Datenmüll. Dieses Vorgehen ist nicht gerade gut.
Stattdessen wäre es besser den Messages eine Anfangs- (Präambel) und evtl eine Endekennung mit zugeben, damit ich weiss wo es beginnt und endet. So, nun die Fragen
1. Wie sollte so eine Präambel aufgebaut sein? (Das Problem ist ja, das im Data-Field jedes mögliche Byte stehen kann)
2. Welche Art von StreamReadern muss ich verwenden für den InputStream und OutputStream des Sockets? Buffered?
3. Hat jemand schon mal was ähnliches gemacht, bzw. evtl sogar ein Beispiel
Danke für eure Hilfe
Gruss
Hab da ein kleines Problem.
Arbeite im Moment an einem Client/Server-Programm. Für die Kommunikation habe ich ein eigenes Protokoll entwickelt (über TCP/IP) das sehr ähnlich dem HTTP ist. Dazu habe ich einen Satz von Message-Klassen definiert um die einzelnen Kommandos sauber zu kapseln. Diese Messages werden dann zwischen den Clients und dem Server ausgetauscht bzw. gesendet ;-). Aus den Messages erzeuge ich dann ein Byte-Array und sende diesen Array über den OutputStream.
Die Messages sind wie folgt aufgebaut:
| ClientID (1 Byte) | Type (1 Byte) | Length (4 Byte) | Data (N Bytes) |
Dies funktioniert soweit so gut. Das Problem beginnt bei hoher Last, wenn viele Clients viele Messages senden. Auf der Server-Seite (und natürlich auch auf der Client-Seite) lese ich die Bytes aus dem Socket mit
Code:
inputstream.read()
Length-Feldes die Daten-Bytes. Ich muss bei dieser Methode davon ausgehen, dass ich immer auch wirklich den Header auslese und nicht sonstigen Datenmüll. Dieses Vorgehen ist nicht gerade gut.
Stattdessen wäre es besser den Messages eine Anfangs- (Präambel) und evtl eine Endekennung mit zugeben, damit ich weiss wo es beginnt und endet. So, nun die Fragen
1. Wie sollte so eine Präambel aufgebaut sein? (Das Problem ist ja, das im Data-Field jedes mögliche Byte stehen kann)
2. Welche Art von StreamReadern muss ich verwenden für den InputStream und OutputStream des Sockets? Buffered?
3. Hat jemand schon mal was ähnliches gemacht, bzw. evtl sogar ein Beispiel
Danke für eure Hilfe
Gruss