7
votes

Android Multi Player jeu sur le réseau

Je programmment un jeu multi-joueurs Android, qui consiste essentiellement à un serveur où les clients se connectent et échangent des messages. Lorsque le joueur se connecte à un serveur, une liste de joueurs lui retourne. Un joueur peut ensuite sélectionner un utilisateur à contester - bien sûr, il doit sélectionner un lecteur à partir de la liste des joueurs, qui ne contient que des utilisateurs connectés.

Lorsqu'un joueur1 conteste Player2, un message doit être transmis à partir du joueur1 au serveur, qui doit envoyer un message au lecteur2, en l'informant sur le défi. Le joueur2 peut alors accepter / refuser le défi.

Je peux utiliser les techniques suivantes pour que cela se produise:

  1. Utilisez le serveur personnalisé / client avec la programmation Java Socket. Le serveur accepte essentiellement une connexion du client, reprochant un nouveau thread pour chaque client connecté. Le problème avec c'est:

    • Il doit y avoir une connexion persistante ouverte du client au serveur gaspiller la durée de vie de la batterie du téléphone Android. Ce n'est pas vraiment une grande limitation car la batterie n'est pas beaucoup consommée.
    • Quand je voudrais développer un autre jeu, je devrai réécrire le code client / serveur à partir de la gratorisation - en choisissant également un autre port pour écouter les connexions entrantes - tout le concept devient plutôt difficile à maintenir.
    • Je suis aussi inquiet si c'est le moyen de le faire. Frayer un autre fil pour chaque client sonne beaucoup si des milliers de clients se connectent en même temps. Mais je suppose que les jeux PC le font comme ça. Pas sûr de Android.
    • Utilisez Java Rest Jersey pour construire le serveur client en haut de HTTP. Ce serait une solution parfaite si le serveur pouvait facilement envoyer des notifications aux clients. Il y a en fait plusieurs décisions de conception ici:

      • Le client tire le serveur pour toutes les nouvelles données / notifications toutes les quelques quelques secondes - c'est vraiment mauvais, car nous sommes bloqués avec une non-réactivité, une retard, etc.
      • Le client peut envoyer une demande d'attente au serveur, de sorte que le client reçoit la réponse uniquement après que certaines données soient disponibles. C'est mieux, mais peut toujours produire un délai lorsque deux notifications une après l'autre doivent être envoyées à l'utilisateur. La première notification est envoyée instantanément, car le client a déjà une connexion ouverte, en attente de recevoir des données. Mais il faudrait attendre que le client initie une autre longue demande HTTP à recevoir la deuxième notification. Le problème devient plus gros car il existe plusieurs notifications qui doivent être envoyées d'une ligne à un client spécifique.
      • Le client peut initier un streaming HTTP, où la communication est laissée ouverte lorsque la demande est traitée, le serveur peut également envoyer plusieurs messages au client chaque fois qu'il le souhaite. Le problème ici est que je ne sais pas à quel point cela fonctionne bien sur Android. J'ai examiné plusieurs implémentations:
        • Java Jersey + Atmosphère: n'a pas réussi à faire du travail. Cela semble le plus prometteur, mais je ne veux pas passer trop de temps dessus, puisque je ne suis même pas sûr si cela fait ce que je veux.
        • Deacon: semble assez soigné, mais après avoir vu le tutoriel vidéo sur sa page Web officielle, je ne suis pas sûr que cela puisse faire ce dont j'ai besoin. Lorsqu'un joueur1 conteste le joueur2, peut-il envoyer une notification à Player2 le permettant de savoir la demande de match?
        • Je serais heureux de savoir comment d'autres jeux multi-joueurs gèrent les communications réseau, si les deux joueurs jouent au jeu sur le réseau.

        • Je suis également ouvert à une suggestion totalement nouvelle comment réaliser ce que je veux. Je peux à peu près beaucoup de code, alors n'hésitez pas à me faire savoir un moyen plus difficile d'atteindre la communication réseau.

          Permettez-moi également de mentionner que je serai heureux de mettre en œuvre une méthode totalement spécifique pour travailler dans mon cas, afin que cela puisse faire tout ce qui fera le travail, mais je cherche également une manière plus générale pour la communication entre clients et serveur. Afin que je puisse programmer une interface / autre et réutiliser le code dans d'autres jeux Android, applications Android.

          J'espère avoir présenté le problème suivant et que je recevrai des réponses précieuses.

          merci


0 commentaires

3 Réponses :


0
votes

Ça sonne comme Android nuage à Le dispositif-messagerie pourrait être ce dont vous avez besoin

notifications push sans l'application qui doit conserver une connexion ouverte


2 commentaires

Salut. J'ai oublié de mentionner que dans mon post. Ce n'est pas une option, car Google pourrait commencer à charger des messages envoyés et je ne suis pas sûr: existe-t-il un nombre limité de message pouvant être envoyé quotidiennement? De plus, je pense aussi que les jeux de réseau à Android n'utilisent pas cela, mais quelque chose de plus sophistivé. J'ai peut-être tort.


"Votre compte d'expéditeur sera attribué au quota par défaut, qui correspond actuellement à environ 200 000 messages par jour" code.google.com/intl/sv-se/andrroid/c2dm/quotas.html



2
votes

Vous devriez jeter un oeil à XMPP. C'est un protocole (créé à l'origine pour les programmes de discussion) qui permet d'envoyer des données XML entre les utilisateurs.
Il possède une relation de serveur client séparée, de sorte que vous puissiez vous concentrer sur le développement d'une application client adaptée aux téléphones et à un autre serveur en fonction de vos besoins.

Il existe des charges d'informations disponibles sur le protocole (je devrais savoir, j'ai écrit une thèse sur l'utilisation du protocole dans les applications de jeu), mais vous pouvez commencer par le regardant sur Wikipedia pour voir si c'est ce que vous voulez.

Asmack est une bibliothèque de création de clients XMPP Android. Il faut quelques modifications pour la configurer et tout faire pour travailler, mais une fois que vous faites, c'est soigné.

edit: relatif à la réponse suggérant à l'aide du C2DM:
à partir du Documents C2DM "Envoi de grand nombre de messages C2DM" :

Envoie-vous des messages C2DM trop fréquemment? Si vous avez besoin de communiquer avec votre application fréquemment sur une courte période de Temps, C2DM n'est probablement pas la meilleure solution. Au lieu de cela, considérez Implétant XMPP ou votre propre protocole pour échanger des messages et utiliser C2DM uniquement pour envoyer la notification initiale.


5 commentaires

Cela pourrait être une option. Je vais regarder dans ça. Je suis également tombé sur ceci lors du googling, je ne l'ai tout simplement pas vu comme la meilleure option. Je pensais que les jeux utilisent quelque chose de différent de nos jours. Donc, fondamentalement, vous suggérez un serveur Java de repos + XMPP? Et oui, les messages sont envoyés assez fréquemment - chaque seconde.


Cela fonctionne étonnamment bon. Mais vous devrez peser le coût supplémentaire de transfert / interprétation de code XML plutôt que de valeurs spécifiques contre le fait que l'ensemble du protocole / des bibliothèques requis est déjà terminé et testé sur plusieurs années.


Salut. Je voudrais une fois de plus envie de vous remercier pour la réponse, mais j'ai quelques problèmes supplémentaires. 1) Étant donné que mes utilisateurs sont connectés sur le XMPP, ils doivent d'abord s'enregistrer avec un mot de passe / nom d'utilisateur que je n'aime vraiment pas. Est-il possible pour eux de spécifier simplement un nom d'utilisateur, qui suffit pour authentifier automatiquement l'utilisateur et le met sur une liste de joueurs. 2) Devrais-je utiliser uniquement les utilisateurs de la session en cours (la session qui se tient à droite, ni devrais-je créer un nouvel utilisateur pour chaque nouveau nom d'utilisateur. Si ce dernier, la base de données peut alors se développer de manière assez grande. Toute pensée est Bienvenue.


Je suppose que vous voulez une sorte d'identification des joueurs, comme un nom d'utilisateur? Si tel est le cas, vous pouvez simplement faire connecter le client avec le nom d'utilisateur en tant que mot de passe, généré au hasard un ou l'identifiant de périphérique, car je pense que le mot de passe est nécessaire en fonction du protocole. Si vous n'avez pas besoin d'enregistrer des données pour les utilisateurs, par exemple Les utilisateurs ne sont utilisés que pour afficher un identifiant (nom d'utilisateur), je suppose que le meilleur serait de supprimer l'utilisateur du serveur lorsqu'ils terminent le jeu et se déconnectent.


Les noms d'utilisateur / mots de passe sont après tout simplement utilisé pour identifier un seul utilisateur dans le réseau. Vous pouvez masquer cela de l'utilisateur sous une couche d'abstraction, laisser votre serveur ou votre client en décider en fonction de certains facteurs appropriés. En fin de compte, il vous appartient comment contrôler cela.



0
votes

Je voterais en faveur d'une technique de passage de message - comme Activemq, rabbbitmq, Zeromq Eor quelque chose comme ça. Sur le côté serveur, vous pouvez rester avec Java ou JavaScript (comme

nœud.js) - Cette solution fournirait la plupart des performances et des latences minimales.

Si la latence n'est pas si critique, vous pouvez aussi bien utiliser les appels de repos avec JSON


0 commentaires