J'écris donc un système de mise en relation d'échecs basé sur une vue du lobby avec des salles de jeux, un chat général, etc. Jusqu'à présent, j'ai un prototype qui fonctionne, mais j'ai de gros doutes concernant certaines choses que j'ai faites avec le serveur. Écrire un serveur de lobby de jeu est une nouvelle expérience de programmation pour moi et je n'ai donc pas de modèle de programmation clair ou précis pour cela. Je n'ai pas non plus trouvé de document décrivant comment cela devrait fonctionner. J'ai commandé "Java Network Programming 3rd edition" sur Amazon et j'attends toujours l'expédition, j'espère que je trouverai quelques exemples / informations utiles dans ce livre.
En attendant, j'aimerais recueillir vos opinions et voir comment vous gérer certaines choses afin que je puisse apprendre à écrire correctement un serveur. Voici quelques questions du haut de ma tête: (peut-être que d'autres viendront)
Tout d'abord, définissons ce que fait un serveur. Sa fonctionnalité principale est de maintenir les connexions TCP avec les clients, d'écouter les événements qu'ils génèrent et de les envoyer aux autres joueurs. Mais y a-t-il plus que cela?
Dois-je utiliser un thread par client? Si c'est le cas, 300 clients = 300 threads. N'est-ce pas trop? Quel matériel est nécessaire pour prendre en charge cela? Et combien de bande passante un lobby consomme alors environ?
Quel type de structure de données doit être utilisé pour contenir les sockets des clients? Comment le protégez-vous des modifications simultanées (par exemple, un joueur entre ou existe dans le lobby) lors de son itération pour envoyer un événement sans nuire au débit? ConcurrentHashMap est-il la bonne réponse ici, ou existe-t-il des techniques que je devrais connaître?
Lorsqu'un utilisateur entre dans le lobby, quel mécanisme utiliseriez-vous pour lui transférer l'état du lobby? Et pendant que cela se produit, où se multiplient les autres événements?
Réponses:
Modélisez tout comme des objets. Vous avez les classes chat-room, game-session, player ... Ne pas générer de nouveaux threads pour les nouveaux joueurs. Au lieu de cela, essayez de voir chaque classe comme une machine à états: un joueur peut être connecté ou déconnecté, il a un TcpConnection et une variable spécifiant combien de temps il lui reste pour faire son mouvement (à titre d'exemple).
Ensuite, lorsque vous avez tous vos objets dans un tableau ou quelque chose comme ça, vous itérez dessus tous les 10 millisecondes (le nombre est bien sûr un exemple) et prenez les mesures appropriées.
Par exemple, mettre fin à une session de jeu si l'un des joueurs quitte le jeu, envoyer des mouvements d'un joueur à l'autre ...
Pour tous les événements qui se produisent dans le jeu, vous devrez envoyer un message via le réseau. Créez une classe / énumération supplémentaire contenant les différents types de messages. Si un joueur fait un mouvement, vous pouvez l'envoyer au serveur "déplacer d4 en d5" ou quelque chose. Si vous ne faites qu'une partie d'échecs, vous pouvez envoyer des chaînes via le réseau. Pour tout ce qui est plus complexe, je vous suggère d'envoyer uniquement des octets uniques.
Les paquets de jeu sont généralement constitués de: la longueur du paquet, le type de message / type d'événement du paquet (déplacement, jointure par le joueur, joueur à gauche, ...) et le contenu (si un joueur se joint, le contenu serait le nom de exemple)
la source
Pour limiter la quantité de threads nécessaires, vous devriez jeter un œil à Java NIO: http://en.wikipedia.org/wiki/New_I/O
la source