2012-04-29 9 views
7

Stavo usando piccoli codici di esempio - pacchetto telnet, ora il codice può stabilire server e client per chattare usando telnet, ma il client può parlare solo con il server. Lo sto riscrivendo per consentire ai client di comunicare con tutti i client, quindi devo tenere un elenco dei canali, quindi quando un client contatta il server, il server può inviare il messaggio a tutti i client. Qualcuno può dirmi come posso ottenere il canale di tutti i clienti? (Il codice di esempio è enter link description here)Netty - come ottenere tutto il canale cliente?

+0

sei riuscito a ottenere correttamente tutti i canali client? –

risposta

1

All'evento channelConnected, afferrare il client dal ChannelHandlerContext e riporlo da qualche parte (una raccolta simultanea sarebbe bello, come ConcurrentHashMap). Dovrai anche implementare il metodo channelClosed per rimuovere il canale disconnesso dalla tua raccolta.

+0

Grazie, l'ho provato all'inizio, ma non sono riuscito poiché non so che l'implementazione ChannelPipelineFactory genera il gestore, costruendo uno spazio di archiviazione per i canali nella giusta posizione, ho successo nel farlo.Comunque, grazie mille :) – chentingpc

5

La proposta di Mauricio è buona. Inoltre, l'API Netty fornisce già un contenitore di canale nello ChannelGroup. È thread-safe e offre anche diverse funzionalità aggiuntive come le operazioni di gruppo su tutti i canali contenuti e la rimozione automatica dei canali contenuti quando vengono chiusi. Da javadoc:

Un set thread-safe che contiene canali aperti e fornisce varie operazioni di massa su . Usando ChannelGroup, puoi categorizzare i canali in un gruppo significativo (ad esempio per un servizio o per stato ). Un canale chiuso viene automaticamente rimosso dalla collezione, in modo da non doverti preoccupare della vita ciclo del canale aggiunto. Un canale può appartenere a più di un ChannelGroup.

3

Ecco un piccolo esempio (sovrascrive channelConnected di SimpleChannelUpstreamHandler):

ChannelGroup allConnected = new DefaultChannelGroup("all-connected"); 

@Override 
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { 
    super.channelConnected(ctx, e); 
    allConnected.add(e.getChannel()); 
} 

ora è possibile inviare messaggi a tutti i canali collegati in questo modo:

ChannelBuffer cb = ChannelBuffers.wrappedBuffer("hello".getBytes(Charset.forName("UTF-8"))); 
    allConnected.write(cb); 
+0

Per Netty 4/5, c'è un esempio simile in javadoc, http://netty.io/4.0/api/io/netty/channel/group/ChannelGroup.html che sovrascrive channelActive() invece chiama anche il super-metodo _after_ aggiungendo il canale. –

+0

@StefanL dato l'esempio nella documentazione, come posso ottenere il canale del cliente ?? (nell'esempio: canaleA, canaleB ..) – HCarrasko

9

Per Netty 4.0.x

Nella classe principale è necessario dichiarare il ChannelGroup:

final ChannelGroup channels = 
       new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); 

Quando è collegato un nuovo client (Si dovrebbe passare i canali oggetto nel costruttore a voi Handler classe):

@Override 
public void channelActive(ChannelHandlerContext ctx) throws Exception { 
    channels.add(ctx.channel()); 
} 

per ottenere tutti i clienti, solo lavoro su canali oggetto :) Se si desidera iterare esso:

for (Channel ch : channels) { 
    //do something with ch object :) 
} 

Speranza che aiuta al prossima generazione