Frage

In meiner Implementierung von Java NIO habe ich nicht in der Lage gewesen SelectionKey.attach () zur Arbeit zu kommen. Im Grunde genommen, wenn Clients einer Verbindung (OP_ACCEPT Interesse ops) Ich füge sie zu einer Karte, wo ihre IP-Adresse zuordnet ein Objekt, das Zustand für die Kunden unterhält. Wenn dann ein OP_READ auftritt, ich wieder die IP-Adresse des Clients abrufen, und dieses Mal den Wert von der Karte erhalten und die Client-Zustand auf diese Weise das Objekt bekommen.

Das Problem hier ist, dass ich eine Karte Lookup EVERY TIME Daten zu tun ist, aus dem Netz lesen. Es gibt eine Menge vergeudete Arbeit dorthin zu gehen. Also, ich war begeistert zu sehen, dass Sie einen beliebigen Objekttyp zu einem SelectionKey anhängen können, die leicht abgerufen werden sollten, wenn Sie SelectionKey.attachment () aufrufen, auch wenn wir jetzt ein anderes Ereignis Handling (abgerufen während OP_READ gegen die setzen in Karte während OP_ACCEPT).

Das Problem ist, dass es nicht funktioniert. Als ich die Anlage abzurufen, ist es immer null. Und wenn ich die Anlage einrichten über attach () und rufen Sie dann sofort Befestigung (), es funktioniert. Irgendwie zwischen verschiedenen Ereignissen, es verliert seine Verbindung.

Es tut mir leid, mein Code ein bisschen zu lang, hier zu posten, aber wenn man sich die Kommentare in diesem Thread zu buchen: Linktext ... Sie werden sehen, dass einige andere im Grunde zu dem gleichen Schluss gekommen sind:., Die () und Befestigung () anhängen nicht funktionieren, und nie haben

Gibt es einen Trick, um es zu arbeiten, oder bin ich mit dem bösen Kopf stecken notwendig manuell eine Suche in einer Karte JEDES MAL tun gibt es ein neues Lese Ereignis zu behandeln?

Schließlich gibt es noch eine Möglichkeit, „wrap“ SelectionKey in einer neuen Unterklasse, die anhängen richtig behandelt () und Befestigung ()?

Danke!

War es hilfreich?

Lösung

Ich habe erfolgreich Objekte SelectionKeys ohne Probleme angebracht, sondern nur aus der gleichen Veranstaltung. Zum Beispiel das erste Mal, dass ich eine OP_READ bekommen, lege ich ein Objekt in den SelectionKey und auf nachfolgende liest ich es wieder, und es funktioniert gut. Vielleicht verschiedene Schlüssel OP_ACCEPT und OP_READ handhaben, da sie verschiedene Ereignisse sind, aber ich denke, das SelectionKey sollte für die gleiche Verbindung sein ... aber wenn Sie verschiedene Verbindungen auch von der gleichen IP machen Sie verschiedene SelectionKeys erhalten.

UPDATE: Ich habe gerade meinen Code und es ist etwas sehr wichtig: Ich habe nicht nennen attach () überhaupt; Ich benutzte die SelectableChannel.register(Selector sel, int ops, Object att) Methode. Wenn Sie das tun, werden nachfolgende Aufrufe Befestigung () auf SelectionKey arbeiten.

Andere Tipps

Es gibt keine CR in der gelinkten Seite, und ich kann nichts sehen auf bugs.sun.com . Allerdings attach / attachment ist sehr einfach Code (wenn auch etwas komplizierter nach meinem Bug rel="nofollow . Meine Vermutung ist, dass Sie eine andere SelectionKey bekommen, so versuchen, es zu wickeln wäre sinnlos.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top