2010-03-14 21 views
5

Por lo que leí sobre SocketChannels de Java NIO y no-blocking [Servidor], debería ser posible escribir un servidor TCP que sostenga varias conexiones usando solo un hilo - Haría un Selector que esperara todos los canales relevantes en el el bucle del servidor.Sockets Java: ¿puedo escribir un servidor TCP con un hilo?

¿Es correcto o me falta algún detalle importante? ¿Qué problemas puedo enfrentar?

(Antecedentes:.. La comunicación TCP sería para un pequeño juego de varios jugadores, por lo max 10-20 conexiones simultáneas Los mensajes se enviarán aproximadamente cada pocos segundos.)

Respuesta

2

Sí, tiene usted razón. Los problemas que puede encontrar es cuando la duración del procesamiento es demasiado larga. En este caso, debe envolver el procesamiento dentro de otro hilo, de modo que no interfiera con el hilo de red y evite un retraso notable.

Otro detalle; Los canales tienen que ver con datos "en movimiento". Si sus datos que desea enviar están listos, puede mover estos datos a un canal de red. La copia/almacenamiento en búfer/etc. todo es hecho por la implementación de NIO, entonces.
Su "hilo de red" de un solo hilo solo dirige la conexión, pero no la estrangula (léase: analogía extraña con un automóvil).

El enfoque básico multiproceso es más fácil de diseñar e implementar que un único NIO con subprocesos. La ganancia de rendimiento no se nota en un pequeño servidor/cliente de juego multijugador, especialmente si un mensaje solo se envía cada pocos segundos.

+0

Bueno ... parece muy familiar para la programación de swing ... donde tiene un hilo de envío de evento principal, pero en el caso del servidor, el nombre es más bien "Solicitar envío de hilo". Y también está la buena práctica de delegar a otros el hilo de esos eventos/requets que requieren algún procesamiento que podría tomar más de un segundo para liberar el hilo de sondeo. ¿Tiene sentido chicos o simplemente estoy diciendo nueces? – Victor

+1

Sí, lo que dices tiene sentido. Lo que describes es típico para los procesadores de eventos. La solicitud se maneja como un evento, y el canal en el que los datos están disponibles o en los que se escribirá se maneja con un hilo diferente al del aceptador. Tenga en cuenta que con el modelo de E/S original a menudo se supone que un servidor genera un nuevo hilo por cliente, pero este modelo basado en eventos con un número fijo de hilos es igualmente útil. – Pindatjuh

0

Sí, puedes. Vea this example para una ilustración sobre cómo hacer esto.

La sección importante es esto:

for (;;) { // Loop forever, processing client connections 
    // Wait for a client to connect 
    SocketChannel client = server.accept(); 

    // Build response string, wrap, and encode to bytes (elided) 

    client.write(response); 
    client.close(); 
} 

Todo esto funciona bien cuando el procesamiento del lado del servidor para cada cliente es insignificante. Sin embargo, un enfoque de múltiples subprocesos escalará mucho mejor.

2

Brian Agnew dijo:

Todo esto funciona bien cuando el procesamiento del lado del servidor para cada cliente es insignificante. Sin embargo, un enfoque de múltiples subprocesos escalará mucho mejor.

I beg to disagree. Un enfoque de un cliente y un hilo agotará la memoria mucho más rápido que si manejas varios clientes por hilo, ya que no necesitarás una pila completa por cliente. Consulte el documento C10K para obtener más información sobre el tema: http://www.kegel.com/c10k.html

De todos modos, si no habrá más de 20 clientes, solo use lo que sea más fácil de codificar y depurar.

Cuestiones relacionadas