2017-09-11 3 views
0

Stellen Sie sich einen Socket-Kanal mit 32-KB-Socket-Empfangspuffer vor.NIO: OP_READ und nicht alle Daten lesen; bleibt OP_READ in Bereitschaft?

24KB Daten werden empfangen, und das OP_READ wird im Bereit-Set gesetzt und ein IO-Thread wird benachrichtigt, um die eingehenden Daten zu verarbeiten.

Normalerweise wird der Socketchannel.read mit einem Bytepuffer aufgerufen, der den Inhalt des Socket-Empfangspuffers vollständig speichern kann.

Aber jetzt meine Frage:

Was passiert, wenn die ByteBuffer nicht groß genug ist, um alle Daten zu lesen, z. ein Bytepuffer von 16 KB, und daher bleiben 8 KB im Socket-Empfangspuffer. Wird das OP_READ aus dem Ready-Set entfernt oder bleibt das OP_READ im Ready-Set, solange Daten im Socket-Buffer des Sockets verbleiben.

Antwort

2

Normalerweise wird die socketchannel.read mit einem Bytepuffer aufgerufen, der den Inhalt des Socket-Empfangspuffers vollständig speichern kann.

Nein ist es nicht. Es wird mit einer ByteBuffer aufgerufen, die groß genug ist, um zu empfangen, was auch immer die Anwendung zu diesem Zeitpunkt bereit ist zu empfangen.

Was passiert, wenn der Bytepuffer nicht groß genug ist, um alle Daten zu lesen, z. ein Bytepuffer von 16 KB, und daher bleiben 8 KB im Socket-Empfangspuffer. Wird die OP_READ aus der Bereitschafts Satz entfernt werden

Nr

oder tut die OP_READ bleiben in der Bereitmenge solange Daten bleiben in socket-Puffer der Steckdose.

Nein, ist es aus dem fertig Satz entfernt, wenn Sie es entfernen, da müssen Sie, aber wenn es noch Daten in der Steckdose ist erhalten auf den nächsten select() puffern es zum fertigen Satz gestellt ist.

Verwandte Themen