Für jeden Interessierten ist die Antwort auf diese Fragen nein, der Socket wird nicht den Puffer außer Betrieb lesen.Kann Java NIO.2 den ByteBuffer out of order lesen?
Ist es möglich, dass die AsynchronousSocketChannel Bytes aus, um zu lesen? Im strugling zu debuggen, wo mein Problem beginnt, mein Protokoll serialisiert Objekte bis zu 32k und schreibt sie in die Steckdose wie folgt aus:
AsynchronousSocketChannel socket; ...
// serialize packet
ByteBuffer base; // serialized buffer (unknown size, size growns as needed with limit of 32k)
for (int j1 = 0; j1 < 6 && base.remaining() > 0; j1++) { // limit to 6 tries
socket.write(base).get(15, TimeUnit.SECONDS);
if (base.remaining() > 0) {
// aparently, if the write operation could write everything at once, we wouldnt have an issue
}
}
Dieser Schreibvorgang wird Concurrent nicht mit Schlössern synchronisiert wird. Ich benutze den Standard-Lesebetrieb wie folgt aus:
AsynchronousSocketChannel socket; ...
Future<Integer> reading = socket.read(getReadBuffer()); // the read buffer is 8k big
// consume the buffer also not concurrently
ich mit bis zu 1000 Bytes jeweils ohne Probleme zu 1000 Pakete pro Sekunde schreiben können, aber irgendwann einen oder anderen Client bricht. Wenn das Paket größer ist, wird die Häufigkeit, die es verarbeiten kann, ohne zu brechen, niedriger sein, Pakete mit 40.000 Bytes werden brechen, wenn ich ungefähr 8 pro Sekunde schreibe.
Beispiel: Ich schreibe 5 Bytes (1,2,3,4,5), der Puffer ist groß genug, um alles auf einmal zu schreiben, aber die Operation entscheidet, mit verbleibenden Bytes im Puffer zu stoppen (dies sollte normal sein) TCP-Verhalten), also sagen wir, die Operation schrieb 1,2,3, stoppte und schrieb die verbleibenden 4,5 (während buf.remain> 0 {write}), beim Lesen ist es höchstwahrscheinlich, dass ich 4,5 zuerst lesen werde und 1,2,3 später sollte dies nicht passieren.
Während auf localhost alles funktioniert, aber nur außerhalb der gleichen Maschine (immer noch das gleiche Netzwerk/Router) wird es nicht funktionieren.
Ich kippe die Puffer nicht zum Schreiben/Lesen. Ich kann sicherstellen, dass es kein Problem mit der Serialisierung gibt, und sowohl der Server als auch der Client sind single-threaded. Ich vergesse etwas zu tun? Irgendwelche Vorschläge, wie Sie das beheben können?
Das Problem liegt in dem Code, den Sie nicht veröffentlicht haben. Wahrscheinlich in der Handhabung der Puffer zwischen Lese- oder Schreibvorgängen. Ein häufiger Fehler tritt beispielsweise auf, wenn Ihr read() einen Teil des nächsten Pakets nach dem ersten Paket abruft und Sie diese nicht richtig in das Paket integrieren, das Sie als nächstes gelesen haben. –