Java jeu multijoueur - concepts de mise en réseau
Pour un projet d'école, nous sommes censés créer un jeu multijoueur en Java (il faut être client/serveur) qui peut être joué sur internet (nous sommes de la programmation à l'école, il n'est donc pas de devoirs). Le jeu est au tour par tour, mais il devrait y avoir un chat, ce qui bien sûr est en temps réel. Cependant, aucun de nous a de l'expérience en programmation réseau et plus je lis, plus de questions, il m'a semblé.
Ma première pensée a été d'utiliser l'API socket pour mettre en œuvre la partie multijoueur. Le serveur attend des nouvelles données des clients. Cependant, il existe de multiples types de données à recevoir, comme les messages de chat, le mouvement, etc. Aussi, une fois la connexion au serveur est établie, certaines données initiales (comme le nom du Joueur) doit être envoyé. Le serveur doit être en mesure de voir ce genre de message qu'il a reçu, mais comment? Je pensais à la création d'une classe Message
avec un champ de type chaîne de type
. Mais dans mon code serveur, je vais obtenir le code comme ceci:
if (message.type.equals("message")) {
//code to execute for chat messages
} else if (message.type.equals("movement")) {
//code to execute for movement
} else if () {
//...
} else {
//...
} //Please ignore syntax errors :P
Quand il y a beaucoup de différents types de données à envoyer (et il y en AURA), ça ne ressemble pas à la manière la plus efficace. Aussi, cela signifierait à la fois le serveur et le client devrait avoir ce Message-classe/interface (code en double).
Quels sont les autres jeu trucs? Par exemple, le joueur 1 se déplace à un personnage de position qui va à l'encontre d'un autre personnage. Le client du joueur 1 calcule ce defeatment et applique les bonnes actions. Mais ce qui doit être envoyer au serveur? Juste la nouvelle position du joueur ou la defeatment? Avec la première option, ce qui signifie que tous les autres clients doivent effectuer les calculs. Ne pouvait pas causer d'ennuis? Comme je n'ai pas de réseau avant l'expérience de la programmation, je suis un peu confus sur la façon de faire toutes ces choses.
J'ai aussi lu dans un autre thread ici sur Stackoverflow que le RMI peut être une meilleure option. Après avoir lu quelques informations à ce sujet, je comprends ce que RMI est, mais je ne suis pas encore en mesure de voir si c'est une bonne option pour ce projet ou non. Des conseils à donner pour cela?
Comme vous le voyez, je suis un peu confus sur la façon de démarrer avec la mise en réseau le cadre de ce projet. J'ai cherché quelques jeu de livres de programmation (Java, bien sûr), mais aucun d'entre eux sont axés sur la mise en réseau de la partie. J'ai aussi cherché pour Java mise en réseau des livres, mais ceux-ci semblent être axées sur la technologie, et non pas sur le code de bonne pratiques.
Si quelqu'un connait un bon livre ou a des conseils dans la bonne diection, il serait grandement apprécié.
Grâce
Au moins, il ne veux pas de code.
Nous sommes censés travailler sur ce projet à l'école, oui. Je ne suis pas demander à quelqu'un de faire mon travail, tout simplement demander des conseils sur la façon de le mettre en œuvre.
Compris, et je pense que votre question est raisonnable, et que @Thomas dit, vous ne lui demandez pas de code, mais tout de même, je pense que d'affirmer qu'il n'est pas de "devoirs" est plein d'humour. Je ne vous souhaite bonne chance.
est compris (au moins ici) comme un exercice dans lequel l'acquisition des connaissances est l'objectif principal, et la chose créée est l'objectif secondaire. (Cela peut être en classe, en laboratoire, à la maison, ou même auto-dirigé, avec pas d'école dans l'image.) Ceci est en contraste à "travailler", dans lequel la création est l'objectif principal et de l'apprentissage est l'objectif secondaire. Nous avons séparé ces concepts afin que nous puissions donner des conseils dans des cas comme le vôtre, et code dans les autres cas.
OriginalL'auteur Bv202 | 2011-09-28
Vous devez vous connecter pour publier un commentaire.
Vous êtes sur la bonne voie, mais il y a peu de choses à éclaircir.
Si vous êtes à l'aide de sockets, vous avez compris que vous avez besoin de définir un protocole commun de placement de la langue pour communiquer les mouvements et l'état du jeu. Prises vous permettent d'envoyer toute sorte de données dans pratiquement n'importe quel format que vous voulez. Il semble que vous êtes en train de penser à propos de sérialisation d'une classe de Message pour envoyer ce type, c'est l'une de faire les choses. Si vous utilisez du RMI (qui dispose de son propre protocol), vous agissez comme si vous étiez en appelant les méthodes de Java, mais en essence, vous êtes en train de faire quelque chose de similaire, la sérialisation de données et de le faire passer sur une prise de courant.
Il n'y a rien implicitement mal sur le partage de code entre le client et le serveur en fait, la plupart des services de ce faire dans une certaine forme. Votre client et le serveur peut à la fois utiliser une bibliothèque commune pour définir les classes de message étant passé autour. RMI utilise la méthode des talons pour déterminer l'interface. Web services de toutes sortes de définir la façon dont les méthodes sont invoquées. L'idée générale est d'exposer l'interface, pas de la mise en œuvre.
Au sujet de votre code, il pourrait être plus propre d'avoir un autre Message sous-classe pour chaque type de message, et vous pourriez vous mettre d'autres paramètres pour chaque message. Vous auriez alors un MessageProcessor classe comme:
Sur ce à envoyer - le principe général devrait être que le client est responsable de l'envoi de leur déplacement vers le serveur, rien d'autre, il n'est qu'un bonus, car le serveur doit vérifier la légalité de la déplacer. Le serveur doit toujours être le facteur déterminant de l'état du jeu pour éviter toute tricherie et erronée de l'implémentation du client
Sauf si vous êtes intéressé à apprendre comment mettre en place votre propre protocole ou de l'utilisation de la bibliothèque de sockets Java, ça va être plus facile à utiliser RMI. Vous pouvez également utiliser du SAVON, de REPOS ou de tout autre protocole, mais je ne serais pas la peine de penser trop dur de savoir laquelle utiliser pour le moment. Je n'ai pas de suggestions au-delà de le RMI documentation, mais je pense que ce livre eu beaucoup d'exemples de code pour la mise en réseau.
OriginalL'auteur dfb
lorsque vous allez avec des sockets chaque client aura son propre connexion sur un serveur de fil d'attente (n'oubliez pas de rincer le stream sur le côté client ou vous allez attendre longtemps)
chaque ligne sera un autre message, et de différencier les types de message que vous pouvez utiliser un "en-tête" au début de chaque message (3-séquence de caractères au début) dire
msg
,mov
,lgn
et l'utilisation d'un trie-comme de sélection avec des interrupteurs pour rapidement déterminer celui que vous avez obtenulors de l'utilisation de RMI, vous pouvez demander au serveur de garder un gestionnaire d'objet (exportés et enregistrés dans le registre) sur lequel un client peut demander une "connexion"-objet qui va être la même que la connexion dans le support de la mise en œuvre, mais vous serez en mesure d'avoir une méthode pour chaque chose que vous voulez faire si les rappels devra être fait d'une autre façon (avec des sockets vous disposez d'une connexion prêt pour cela)
OriginalL'auteur ratchet freak