Wie wird benachrichtigt, wenn ein SocketChannel geschlossen wird?

8

Ich möchte benachrichtigt werden, wenn ein SocketChannel hat seine close Methode genannt. Mein erster Gedanke war, einen Wrapper zu erstellen, der einen Listener benachrichtigt, wenn die Methode implCloseSelectableChannel aufgerufen wird (da die close -Methode selbst als final in AbstractInterruptibleChannel deklariert ist). Diese Lösung funktioniert, aber als ich versuchte, sie mit einem Selector zu registrieren, würde ich wegen der folgenden Überprüfung in IllegalSelectorException :% /% ein SelectorImpl bekommen %Vor%

Jetzt kann ich die register -Methode nicht überschreiben, um sie an die eingebundene SocketChannel zu delegieren, weil final in AbstractSelectableChannel deklariert ist und ich SelChImpl nicht implementieren kann, weil sie standardmäßig in% co_de sichtbar ist % Paket. Der einzige Weg, den ich von hier aus sehen könnte, wäre, mein eigenes sun.nio.ch und SelectorProvider zu machen, aber das scheint für etwas so einfaches Overkill zu sein.

Gibt es einen einfacheren Weg, benachrichtigt zu werden, wenn ein Selector geschlossen wurde oder muss ich meinen Programmentwurf überdenken?

SocketChannel Beispiel:

%Vor%     
Jeffrey 25.02.2012, 16:52
quelle

2 Antworten

12

Wenn das SocketChannel von Ihnen geschlossen wird, schließen Sie es, damit Sie sich selbst so benachrichtigen können, wie Sie möchten.

Wenn Sie benachrichtigt werden möchten, wenn der Partner die Verbindung schließt, , wird OP_READ ausgelöst, und ein Lesevorgang gibt -1 zurück.

    
EJP 27.02.2012, 08:58
quelle
-1

das ist böse. Sie könnten vielleicht ein Byte-Level-AOP-Paket wie verwenden (mit aop können Sie sollte in der Lage sein, einen Cutpoint auf der close-Methode hinzuzufügen, die Ihren Callback ausführt).

Sie könnten auch ein Paket mit dem gleichen Namen wie das sun-Paket erstellen und die Schnittstelle dort implementieren.

aber ich kann keinen guten, sauberen Weg sehen, dies zu tun.

    
andrew cooke 25.02.2012 16:58
quelle

Tags und Links