Als Damon Gant sagte, ist TCP ein Streaming-Protokoll. Ich schlage vor, Sie erstellen Ihr eigenes Protokoll. Ich würde keine Fäden senden. Wenn Sie etwas nicht-Triviales tun, ist dies wirklich der beste Weg zu gehen.
Normalerweise schließe ich eine magische Zahl, Prüfsumme, Paketkörperlänge in Bytes und Protokollversion in meinen Protokollheadern ein. Die magische Zahl erleichtert das Abgrenzen von Paketen in einem Stream (sehr nützlich zum Debuggen Ihres benutzerdefinierten Protokoll-Streams.) Wenn Sie eine Prüfsumme verwenden, können Sie sicherstellen, dass Sie die Dinge korrekt analysieren. Eine Prüfsumme hilft nicht sehr bei der Integrität über TCP, da das TCP-Protokoll bereits eine Prüfsumme hat. Die Paketkörperlänge hilft Ihnen zu erkennen, wenn Sie alle Bytes für Ihr Paket haben. Die Protokollversion kann Ihnen helfen, die Bytes des Paketkörpers zu interpretieren.
Nach dem Empfangen von Daten, legen Sie alle Bytes in einen separaten Puffer und suchen Sie nach Ihrem Protokoll-Header. Wenn Sie Ihre Kopfzeile analysieren können, überprüfen Sie, ob alle Bytes des Pakets vorhanden sind. Wenn ja, parse das Paket. Wiederholen Sie diesen Vorgang, bis Sie ein unvollständiges Paket gefunden haben oder der Puffer leer ist.
Für jedes Paket, das Sie senden möchten, würde ich eine Klasse erstellen. Wenn Sie ein Paket senden möchten, erstellen und serialisieren Sie die richtige Klasse und fügen Sie den Protokollheader für die Bytes dieser Klasse voran.
Sie könnten Javas Serializer verwenden, aber wenn Sie viele Clients mit einem einzelnen Server verbinden, möchten Sie wahrscheinlich nicht Java für den Server verwenden. Dies macht die Sache schwierig, da Sie jetzt einen Java-Serializer in einer anderen Sprache implementieren müssen. Aus diesem Grund ist es in der Regel besser, entweder Ihre Pakete manuell in Bytes umzuwandeln (langwierig, aber einfach) ODER Sie könnten Ihren eigenen Serialisierer mithilfe von Reflektion schreiben. Ich würde Letzteres für größere Projekte vorschlagen.
Haben Sie debuggen, um herauszufinden, ob k> 1 ist? –
K = 1. Wenn ich es gut bekomme, sollte es sein, wie viele Elemente im Byte-Array sind. Aber da es nur ein Element gibt, k = 1. – Kubik
Versuchen Sie, den Ausgangsstrom nach dem Senden von Daten zu löschen. –