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?
risposta
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.
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
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.
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);
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. –
@StefanL dato l'esempio nella documentazione, come posso ottenere il canale del cliente ?? (nell'esempio: canaleA, canaleB ..) – HCarrasko
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
sei riuscito a ottenere correttamente tutti i canali client? –