2012-04-29 19 views
7

Estaba usando netty example codes - telnet packet, ahora el código puede establecer el servidor y el cliente para chatear usando telnet, pero el cliente solo puede hablar con el servidor. Lo estoy reescribiendo para que los clientes puedan hablar con todos los clientes, por lo que debo mantener una lista de canales, de modo que cuando un cliente se contacte con el servidor, el servidor pueda enviar el mensaje a todos los clientes. ¿Alguien puede decirme cómo puedo obtener el canal de todos los clientes? (El código de ejemplo es enter link description here)Netty: cómo obtener todos los canales de clientes?

+0

¿Se las arregló para obtener todos los canales de clientes correctamente? –

Respuesta

1

En el evento channelConnected, agarra el cliente desde el ChannelHandlerContext y almacenarlo en algún lugar (una colección concurrente sería bueno, como ConcurrentHashMap). También deberá implementar el método channelClosed para eliminar el canal desconectado de su colección.

+0

Gracias, lo he probado al principio, pero fallado ya que no sé si la implementación ChannelPipelineFactory genera el Handler, al construir un almacenamiento para los canales en la posición correcta, tengo éxito en hacerlo.De todos modos, muchas gracias :) – chentingpc

5

La propuesta de Mauricio es buena. Además, Netty API ya proporciona un contenedor de canales en el ChannelGroup. Es seguro para subprocesos y también proporciona varias funciones adicionales, como operaciones de grupo en todos los canales contenidos y eliminación automática de canales contenidos cuando están cerrados. Desde javadoc:

Un conjunto de hilos seguros que contiene canales abiertos y proporciona varias operaciones masivas en ellos. Con ChannelGroup, puede categorizar los canales en un grupo significativo (por ejemplo, en una base por servicio o por estado ). Un canal cerrado se elimina automáticamente de la colección, para que no tenga que preocuparse por la vida ciclo del canal agregado. Un canal puede pertenecer a más de un ChannelGroup.

3

He aquí un pequeño ejemplo (anula channelConnected de 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()); 
} 

ahora puede enviar mensajes a todos los canales conectados de esta manera:

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

Por Netty 4/5, hay un ejemplo similar en el javadoc, http://netty.io/4.0/api/io/netty/channel/group/ChannelGroup.html que anula channelActive() en su lugar y también llama al supermétodo _después_ de agregar el canal. –

+0

@StefanL dado el ejemplo en la documentación, ¿cómo puedo obtener el canal del cliente? (en el ejemplo: channelA, channelB ..) – HCarrasko

9

Por Netty 4.0.X

En la clase principal debe declarar ChannelGroup:

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

Cuando se conecta un nuevo cliente (Usted debe pasar los canales de objeto en el constructor para que manipulador de clase):

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

para obtener todos los clientes, sólo el trabajo a través de canales objeto :) Si desea repetir que:

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

espero que ayude a la próxima generación

Cuestiones relacionadas