NIO Selector.select() blockt nicht.

Status
Nicht offen für weitere Antworten.

kaesebrot

Mitglied
Hallo,

das Aufrufen der select-Methode eines Selectors sollte blockieren, wenn nicht einer der folgenden Fälle vorliegt
* wakeup / interrupt
* close
* channel ausgewählt

Das folgende Beispiel blockiert nicht im letzten select-Aufruf:

Code:
SocketChannel clientChannel = SocketChannel.open();
clientChannel.configureBlocking(false); 
clientChannel.connect(new InetSocketAddress("192.168.0.11", 12344));
		
Selector selector = Selector.open(); 
clientChannel.register(selector, SelectionKey.OP_CONNECT); 
selector.select(); 
			
Iterator<SelectionKey> keys = selector.selectedKeys().iterator(); 
while (keys.hasNext()) {
	SelectionKey key = keys.next(); 
	keys.remove(); 
				
	if (key.isConnectable()) {
		clientChannel.finishConnect(); 
	}
}
			
selector.select();
			
System.out.println(selector.isOpen()); 
System.out.println(selector.selectedKeys().size());

Die Ausabe ist wie folgt

Code:
connected
true
0


warum ist das so? Es ist doch keiner der oben angebenen Fälle zutreffend, oder?


viele Grüße,
Käse
 

Kr0e

Gesperrter Benutzer
Nungut, ich denke es liegt einfach daran, dass du den Channel nur auf Connect registrierst...
Warum sollte select blocken, wenn kein Channel außer der eine registriert ist. Und Der der registriert ist, kann nicht mehr "Connectable" sein, da er bereits connected ist... ;)



Gruß Chris
 

kaesebrot

Mitglied
Hi,

es geht mir hier mehr ums Prinzip. Warum es meiner Meinung nach blocken müsste habe ich bereits beschrieben. Wenn ich andere Interessen hinzufüge geht es natürlich. Allerdings habe ich Lese- und Schreib- Interessen auf andere Threads ausgelagert.

Ich habe es aktuell gelöst indem ich den key einfach abbreche. Jedoch verstehe ich immernoch nicht, warum der Selektor nicht blockt. Evtl. findet sich ja noch jemand der Klarheit in die Sache bringen kann.



viele Grüße,
Käse
 

Kr0e

Gesperrter Benutzer
Ähm, also niemand schreibt doch, dass im Falle einer erfolgreichen Verbindungsaufnahme weiterhin auf OP_CONNECT gelauscht wird... Also wissen tuh ichs nicht, aber probier doch mal folgendes: Schau doch mal, ob dein Channel überhaupt noch registriert ist ?! Ich mein, vlt. löscht sich die registrierung für OP_CONNECT nachdem finishConnect aufgerrufen wird.. Macht ja auch durchaus SINN!! Du hast schon recht, nirgendwo steht was davon (Zumindest hab ich noch nichts in der Doc gefunden) dass da irgendeine Registrierung gelsöcht wird, aber anders kann ichs mir nicht erklären xD^^ Aber benutze select() nicht als eine Art Thread Blocker, dafür ist es nciht gedacht... Wenns nur ums Interesse geht, dann musst etwas rum probieren:

Also nochmal:

-Key evt. gelöscht nach finishConnect() ??

Gruß Chris
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben