Así que estoy escribiendo un sistema de emparejamiento de ajedrez basado en una vista de Lobby con salas de juego, chat general, etc. Hasta ahora tengo un prototipo que funciona pero tengo grandes dudas sobre algunas cosas que hice con el servidor. Escribir un servidor de lobby de juegos es una nueva experiencia de programación para mí y, por lo tanto, no tengo un modelo de programación claro ni preciso. Tampoco pude encontrar un documento que describiera cómo debería funcionar. Pedí "Java Network Programming 3rd edition" de Amazon y todavía estoy esperando el envío, espero encontrar algunos ejemplos / información útiles en este libro.
Mientras tanto, me gustaría reunir sus opiniones y ver cómo manejaría algunas cosas para que pueda aprender a escribir un servidor correctamente. Aquí hay algunas preguntas fuera de mi cabeza: (puede haber más)
Primero, definamos lo que hace un servidor. Su funcionalidad principal es mantener conexiones TCP con clientes, escuchar los eventos que generan y enviarlos a los otros jugadores. ¿Pero hay algo más que eso?
¿Debo usar un hilo por cliente? Si es así, 300 clientes = 300 hilos. ¿No es eso demasiado? ¿Qué hardware se necesita para soportar eso? ¿Y cuánto ancho de banda consume un lobby, aproximadamente?
¿Qué tipo de estructura de datos se debe utilizar para mantener los sockets de los clientes? ¿Cómo lo protege de modificaciones concurrentes (p. Ej., Un jugador entra o existe en el lobby) cuando lo itera para despachar un evento sin afectar el rendimiento? ¿Es ConcurrentHashMap la respuesta correcta aquí, o hay algunas técnicas que debería saber?
Cuando un usuario ingresa al lobby, ¿qué mecanismo usarías para transferirle el estado del lobby? Y mientras esto sucede, ¿dónde surgen los otros eventos?
Respuestas:
Modela todo como objetos. Tienes las clases sala de chat, sesión de juego, jugador ... No generes nuevos hilos para nuevos jugadores. En su lugar, trate de ver cada clase como una máquina de estados: un jugador puede estar conectado o desconectado, tiene una TcpConnection y una variable que especifica cuánto tiempo le queda para hacer su movimiento (solo como ejemplo).
Luego, cuando tiene todos sus objetos en una matriz o algo así, lo repite cada 10 milisegundos (el número también es un ejemplo, por supuesto) y toma las medidas apropiadas.
Por ejemplo, finalice una sesión de juego si uno de los jugadores abandonó el juego, envíe movimientos de un jugador a otro ...
Para todos los eventos que sucedan en el juego, deberá enviar un mensaje a través de la red. Cree una clase / enumeración adicional que contenga los diferentes tipos de mensajes. Si un jugador realiza un movimiento, puede enviarlo al servidor "mover d4 a d5" o algo así. Si solo hace un juego de ajedrez, puede enviar cadenas a través de la red. Para cualquier cosa más compleja, sugeriría que envíe solo bytes únicos.
Por lo general, los paquetes del juego consisten en: la longitud del paquete, el tipo de mensaje del paquete / tipo de evento (mover, jugador unido, jugador izquierdo, ...) y el contenido (si un jugador se une, el contenido sería el nombre para ejemplo)
fuente
Para limitar la cantidad de hilos necesarios, debe echar un vistazo a Java NIO: http://en.wikipedia.org/wiki/New_I/O
fuente