Salve,
stavo facendo qualche prova per vedere come funziona la classe Selector e SocketChannel per quanto riguardava la classio NIO.
Ho fatto un programma che crea due Thread. Un Thread server che accetta una connessione e inizia a leggere.
L'altro Thread crea uno socketchannel e un selector impostando il controllo sullo stato di scrittura. Ossia mi deve avvertire quando nel canale io posso scrivere.
SocketChannel canale=SocketChannel.open(new InetSocketAddress("localhost",12345));
canale.configureBlocking(false); // non bloccante
Selector selezione=Selector.open(); // creo il selector
canale.register(selezione,SelectionKey.OP_WRITE); // metto il controllo sullo stato di scrittura
Subito, appena connesso, faccio una selector per vedere se posso scrivere nel canale. Correttamente, mi dice che ci posso scrivere sul canale perchè il buffer è vuoto.
Subito dopo aver fatto la Selector a fare le seguenti cose:
scrivere nel buffer e fare la selector
controllare nuovamente subito la selector.
In entrambi i casi dopo la prima selector, la seconda chiamata non seleziona alcun canale. Ritorna cioè che su ZERO canali posso farci le operazioni che volevo fare, cioè in questo caso significa che l'unico canale creato non posso scriverci! Eppure non ci ho fatto alcuna operazione ancora.
Le specifiche del selector dicono:
This method performs a blocking selection operation.
It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.
Appena chiamo la select esce selezionando zero canali. A questo punto mi chiedo qualche è l'errore!
Questo è il codice del client incriminato:
codice:
Thread.sleep(1000);
SocketChannel canale=SocketChannel.open(new InetSocketAddress("localhost",12345));
canale.configureBlocking(false);
Selector selezione=Selector.open(); //Creo il selector
canale.register(selezione,SelectionKey.OP_WRITE); // Registro per la scrittura
byte stringa[]=new byte[1000]; // Creo un buffer
System.out.println("Client: Riempio il buffer di merda");
for(int m=0; m<stringa.length;m++) stringa[m]=(byte)((m*65537)%253-126);
System.out.println("Stringa creata");
ByteBuffer buffer = ByteBuffer.wrap(stringa);
int i=0;
int num=selezione.select(); // Provo a fare la select
if(num>0) { // La prima chiamata ha sempre successo
Set vari=selezione.keys();
Iterator vario=vari.iterator();
while(vario.hasNext()) {
SelectionKey abla=(SelectionKey)vario.next();
System.out.println("Questo socket è in scrittura") // Questo lo stampa;
}
}
System.out.println("Trovati "+num+" channel pronti"); // Stampa che ha trovato un canale
num=selezione.select(); // Riprovo a fare la select
if(num>0) {
Set vari=selezione.keys();
Iterator vario=vari.iterator();
while(vario.hasNext()) {
SelectionKey abla=(SelectionKey)vario.next();
System.out.println("Questo socket è in scrittura?");
}
}
System.out.println("Trovati "+num+" channel pronti"); // Questa volta nessun canale è pronto
System.out.println("Sto spedendo sul canale "+canale);
System.out.flush();
int scritti=canale.write(buffer); // scrivo nel buffer
System.out.println("Spedito tutto ("+scritti+") \nClient in attesa della select");
System.out.println( "Processed "+buffer.limit()+" from " );
num=0;
while(num==0) { // il ciclo si ripete saturando uno dei core del processore
num=selezione.select(); // faccio la select non bloccante
System.out.println("Trovati "+num+" channel pronti. Connesso:"+selezione); // Stampa che ha trovato zero canali pronti
}
System.out.println("Client: esco"); // Non arriva mai a questo punto.
E' tre giorni che non capisco qualche è l'errore. Lo so che è la prima volta che programmo in java, ma non pensavo fosse così traumatico iniziare ;_;
Vi prego, help me!
grazie in anticipo