Newsgroup: it.comp.java
Titolo: Non-blocking io (problemi)

Qualcuno ha avuto qualche esperienza con il nuovo sistema di i/o del jdk1.4?
Sto provando uno degli esempi pubblicati da sun (riportato in fondo al post)
ma non c'è verso di farlo funzionare: il programma parte senza sollevare
eccezioni, ma si blocca sulla select del selettore e ogni tentativo di
connessione sulla porta specificata fallisce.
Qualche idea?
Grazie,
    Alessio
/*** NBTimeServer.java ***/
package com.fs.abel.nbio;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.net.*;
import java.util.*;
/**
 *
 * @author  alessio.spadaro
 */
public class NBTimeServer {
    private static final int DEFAULT_TIME_PORT = 8901;
    // Constructor with no arguments creates a time server on default port.
    public NBTimeServer() throws Exception {
 acceptConnections(this.DEFAULT_TIME_PORT);
    }
    // Constructor with port argument creates a time server on specified
port.
    public NBTimeServer(int port) throws Exception {
 acceptConnections(port);
    }
    // Accept connections for current time. Lazy Exception thrown.
    private static void acceptConnections(int port) throws Exception {
 // Selector for incoming time requests
 Selector acceptSelector = SelectorProvider.provider().openSelector();
 // Create a new server socket and set to non blocking mode
 ServerSocketChannel ssc = ServerSocketChannel.open();
 ssc.configureBlocking(false);
 // Bind the server socket to the local host and port
 InetAddress lh = InetAddress.getLocalHost();
 InetSocketAddress isa = new InetSocketAddress(lh, port);
 ssc.socket().bind(isa);
 // Register accepts on the server socket with the selector. This
 // step tells the selector that the socket wants to be put on the
 // ready list when accept operations occur, so allowing multiplexed
 // non-blocking I/O to take place.
 SelectionKey acceptKey = ssc.register(acceptSelector,
           SelectionKey.OP_ACCEPT);
 int keysAdded = 0;
 // Here's where everything happens. The select method will
 // return when any operations registered above have occurred, the
 // thread has been interrupted, etc.
 while ((keysAdded = acceptSelector.select()) > 0) {
     // Someone is ready for I/O, get the ready keys
     Set readyKeys = acceptSelector.selectedKeys();
     Iterator i = readyKeys.iterator();
     // Walk through the ready keys collection and process date requests.
     while (i.hasNext()) {
  SelectionKey sk = (SelectionKey)i.next();
  i.remove();
  // The key indexes into the selector so you
  // can retrieve the socket that's ready for I/O
  ServerSocketChannel nextReady =
      (ServerSocketChannel)sk.channel();
  // Accept the date request and send back the date string
  Socket s = nextReady.accept().socket();
  // Write the current time to the socket
                PrintWriter out = new PrintWriter(s.getOutputStream(),
true);
  Date now = new Date();
  out.println(now);
  out.close();
     }
 }
    }
    // Entry point.
    public static void main(String[] args) {
 // Parse command line arguments and
 // create a new time server (no arguments yet)
 try {
  NBTimeServer nbt = new NBTimeServer();
 } catch(Exception e) {
  e.printStackTrace();
 }
    }
}

  * @author  alessio.spadaro
Se questo e' l'esempio di Sun, questi commenti sarebbe bene non ci fossero.
uL


Il commento lo ha inserito NetBeans quando ho importato il codice e non ci
ho fatto caso...
Grazie mille della segnalazione...

 ha scritto:

ROTFL

Grazie dell'aiuto, cmq il codice in questione non ha nessun problema, è la
mia macchina di sviluppo che ha una configurazione di rete balorda.
Scusate il disturbo.
Alessio

 ho fatto caso...
Strano xo' che NetBeans abbia eliminato la licenza Sun... ;)
UL

mia macchina di sviluppo che ha una configurazione di rete balorda.
se ti capita di creare un server con le nio ci posti le impressioni? 
Dovrei convertire un server che spawna un thread per ogni connessione
ma per ora funge e non ho voglia di rimetterci le mani (se solo
ripenso ai casimi per sincronizzare tutto.. brrrr :D) 

Ok, mi hai scoperto: volevo attribuirmi la paternità del codice per ottenere
un brevetto sullo stesso e fare causa alla Sun ;)
Cmq nella risposta potevi almeno dire se sapevi o meno qualcosa riguardo al
mio problema (invece di cazziarmi e basta...).
Grazie comunque per l'appunto, farò + attenzione.
Ciao,
    Alessio

 mio problema (invece di cazziarmi e basta...)
Beh sapevo che l'esempio del jdk funzionava e che poteva essere altro 
che un problema di conf di rete, ma avendo tu cambiato l'intestazione 
non potevo sapere se non avessi toccato anche qualche altra cosa nel codice.
Vedi che il crimine non paga? :)
ciao
uL

 che un problema di conf di rete, ma avendo tu cambiato l'intestazione
Beh, suggerendomi il possibile problema avresti dato un senso a questa
conversazione: sono nuovo del newsgroup ma mi sembra di capire che lo scopo
sia la discussione ed il reciproco supporto, non il battibecco ;)

 sia la discussione ed il reciproco supporto, non il battibecco ;)
Quale battibecco, scusa?
Ti ho soltanto fatto notare una cosa, ed anche in modo garbato.
Un consiglio: sui ng l'ego si mette da parte, e il tempo e' prezioso
ciao
uL

 e il tempo e' prezioso
Vale anche per me...
Ciao

 se ti capita di creare un server con le nio ci posti le impressioni?
Sicuramente! Ci sto lavorando.
Ciao,
    Alessio

 
Dai, facciamo la gara a chi ha l'ultima parola...
uL

 ripenso ai casimi per sincronizzare tutto.. brrrr :D)
Ho terminato il porting di un server simile a quelli di cui parli e tutto
sembra funzionare ottimamente. Il framework permette di mantenere in modo
agevole un riferimento sulla connessione tramite il metodo attach(Object)
delle chiavi di selezione (utile per mantenere ad esempio un descrittore
della connessione), cosa che snellisce sensibilmente il codice da scrivere
per la gestione dei client.
Nel mio server ero costretto ad utilizzare 2 thread per ogni connessione
(per mantenere il disaccoppiamento tra i moduli) arrivando a punte di 2000
thread instanziati (penso sia la causa dei crash che ogni tanto mi capitano
^-^' ) solo per le connessioni, mentre con nio ho una decina di thread che
gestiscono tutto.
Finora non ho riscontrato alcun problema (a parte il mio errore iniziale
^-^' ).
Mi č stato di grande ispirazione l'articolo di Tim Burns
http://www.owlmountain.com/tutorials/NonBlockingIo.htm
che a sua volta č basato sull'esempio di Sun.
Ciao,
    Alessio