2012-09-09 25 views
8

En Java NIO, es fácil comprender por qué ServerSocketChannel debe tener un selector. El selector puede verificar entre varios canales de clientes que están listos para operaciones de E/S.En Java NIO, ¿es útil un selector para un cliente SocketChannel?

Sin embargo, en algunos comentarios que he leído en la web, el mecanismo selector se aplica al cliente SocketChannel. No entiendo por qué un selector es útil para un cliente. ¿Alguien puede explicar por qué es útil en circunstancias normales en las que solo hay un servidor?

+0

Por ejemplo, http://tutorials.jenkov.com/java-nio/socket-channel.html en la parte inferior de la página hace la recomendación para selectores y SocketChannels. – Arvanem

+0

Pero él no recomienda nada de eso para los clientes. Hay muchos malos consejos en ese tutorial: bucle en modo no bloqueante, por ejemplo. Encuentra uno mejor. – EJP

+0

@EJP lo intentará, gracias. – Arvanem

Respuesta

6

A menos que se conecte a cientos de servidores, es difícil ver el punto de NIO sin bloqueo en un cliente. Pero si usa NIO sin bloqueo, definitivamente debe usar un Selector; de lo contrario, no podrá saber cuándo leer el canal o cuándo podrá volver a escribirse después de una escritura incompleta.

5

Los selectores le permiten dar servicio a la comunicación simultánea a través de múltiples canales con un solo hilo. Puede ser útil en un cliente cuando debe comunicarse con varios servidores al mismo tiempo o cuando se comunica con computadoras similares en el rol de un cliente, como cuando lee un torrente.

+0

Gracias por su respuesta. También me gustaría contribuir que los Selectores para clientes son aparentemente necesarios para el intercambio mutuo de SelectionKeys entre el cliente y el servidor. ¿Estás de acuerdo o en desacuerdo? – Arvanem

+0

@Arvanem No diría que son "necesarios", porque puede hacer lo mismo con dos hilos. Sin embargo, los selectores son definitivamente convenientes, lo que le permite escribir un código de un único subproceso para abordar una tarea simultánea. – dasblinkenlight

+0

Pero es necesario si el canal del socket del servidor está utilizando un selector, ¿verdad? ¿Porque no hay forma de apartarse de un selector que te permite disparar SelectionKey al servidor? – Arvanem