IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Comment gérer le protocole tcp (ou autres) pour un serveur de jeu.


Sujet :

Réseau/Web Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 0
    Points
    0
    Par défaut Comment gérer le protocole tcp (ou autres) pour un serveur de jeu.
    Bonjour à tous,
    Je m'intéresse depuis quelques temps à la programmation réseau avec python et j'ai vraiment du mal à trouver le moyen correct de faire communiquer deux applications (un client et un serveur) pour un petit jeu réseau que j'ai pour objectif de réaliser.

    Pour l'instant j'utilise le protocole Tcp qui me semble un bon choix mais je ne suis pas certain.
    Si j'ai bien compris le principe de la programmation réseau en python nous avons un socket avec lequel nous faisons transiter des paquets avec les méthodes send et recv.

    Une première question que je me pose est, est-ce vraiment utile d'envoyer des paquets autant de fois que possible du client vers le serveur? (Sachant que celui-ci devra gérer plusieurs connexions simultanément? En plus d'utiliser le protocole Tcp qui semble assez lourd celons ce que j'ai pu comprendre).

    Ensuite, est-ce que recevoir des données du coté du serveur qui sont des chaînes de caractères sérialisées par le module json pour faire passer la position et le nom du joueur par exemple est une bonne idée? Je me demande comment je devrais faire pour faire transiter ces données si je ne suis pas en moyen de recevoir des données qui ne sont pas "scinder" par deux paquets. Devrais-je utiliser plusieurs sockets différents ? Un pour la position x, un pour la position y et un autre pour le nom de manière à les envoyer sans sérialisation?

    Je me sent vraiment perdu face à la problématique du réseau, merci à vous d'avoir lu et n'hésitez pas à m'envoyer des ressources qui pourraient m'aider dans ce domaine car les seuls cours que j'ai pu trouver se penchent plus sur les couches 1, 2, 3 et les autres semblent ne vraiment pas aller dans les détails.

  2. #2
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Points : 704
    Points
    704
    Par défaut
    Bonjour,

    Citation Envoyé par Filadelphila Voir le message
    Si j'ai bien compris le principe de la programmation réseau en python nous avons un socket avec lequel nous faisons transiter des paquets avec les méthodes send et recv.
    ça va dépendre de la bibliothèque utilisée, si vous utilisez socket surement, après rien ne vous oblige à utiliser ça coté serveur, ou coté client, ou les deux.

    Une première question que je me pose est, est-ce vraiment utile d'envoyer des paquets autant de fois que possible du client vers le serveur? (Sachant que celui-ci devra gérer plusieurs connexions simultanément? En plus d'utiliser le protocole Tcp qui semble assez lourd celons ce que j'ai pu comprendre).
    Je ne me suis jamais attelé à ça mais je dirais qu'il y a un juste milieu entre charge du serveur et taux d'envoie, juste milieu qu'il convient d'accorder avec ce que vous faite de ces données. Et oui si vous devez afficher les données ça ne sera pas très gourmand mais si vous devez faire des calculs complexes ça devient plus compliqué. Mais si on part du principe que "envoyer des paquets autant de fois que possible du client vers le serveur" sous entends qu'il y a une information utile à transmettre et que la charge du serveur le permet alors oui, comme je l'ai dit tout est une question de juste milieu.

    Ensuite, est-ce que recevoir des données du coté du serveur qui sont des chaînes de caractères sérialisées par le module json pour faire passer la position et le nom du joueur par exemple est une bonne idée? Un pour la position x, un pour la position y et l'autre pour le nom de manière à les envoyer sans sérialisation?
    Utiliser le format de donnée JSON est en effet une bonne idée, toute la "difficulté" pourrait être de normaliser la façon dont est structuré la chaîne, les formats de donnée XML et tout ce qui en découle peuvent aussi être intéressant.

    Je me demande comment je devrais faire pour faire transiter ces données si je ne suis pas en moyen de recevoir des données qui ne sont pas "scinder" par deux paquets. Devrais-je utiliser plusieurs sockets différents ?
    Je n'ai jamais étudié la question mais je dirais que ce n'est pas à vous de gérer ça, si l'information doit être découpée pour être transportée elle sera remise dans le bonne ordre et l'information sera "ré-assemblée"
    Sur ce point là je ne suis pas sûr, j’imagine que tout se passe au niveau de la couche transport ?


    Devrais-je utiliser plusieurs sockets différents ? Un pour la position x, un pour la position y et l'autre pour le nom de manière à les envoyer sans sérialisation?
    non, si demain vous devez transmettre le nombre de point de vie ? et de mana ? et de munition ? et de ect... enfin bref ça risque d'être compliqué à gérer vous voyez.

    Pour un projet comme ça je me demande si quelque chose dans le genre twisted ne pourrais pas aller ? cependant c'est une bibliothèque assez velu et quand je vois le code source de Matrix ça me donne le tournis

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Citation Envoyé par Filadelphila Voir le message
    Pour l'instant j'utilise le protocole Tcp qui me semble un bon choix mais je ne suis pas certain.
    Si j'ai bien compris le principe de la programmation réseau en python nous avons un socket avec lequel nous faisons transiter des paquets avec les méthodes send et recv.
    Il n'y a rien de Python dans la programmation réseau: les sockets sont une interface système, et TCP un protocole parmi d'autre....
    Et vous n'échangez pas des "paquets" mais des bytes (un stream de bytes).
    Ça veut dire que si un client fait plusieurs send de 100 bytes, coté serveur les appels à recv pourront retourner 50 bytes, puis 200 bytes puis encore 50 bytes.

    Pour échanger des "messages", il va falloir savoir à quel byte il commence et à quel byte ils se termine. Sinon lorsque vous allez faire json.loads çà risque de planter s'il n'y a pas toutes les données ou s'il y en a trop.
    note: ce n'est pas parce que vos premiers tests "fonctionnent" que vous n'aurez pas le problème plus tard. Il dépend de la charge du serveur, du nombre de clients,....

    Puis il va falloir définir un protocole. C'est bien de dire que le client expédie des messages tout le temps mais est-ce que ce sera une information "utile"? Peut être que le client peut se contenter d'expédier sa nouvelle position après un déplacement, peut être qu'il faudra expédier d'autres types de messages, ... peut être qu'il faudra que le serveur puisse demander des informations complémentaires. Tout çà est un dialogue, qui va dépendre de l'état du jeu, qui s'appelle protocole.

    - W

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Merci à vous,
    Une optimisation est effectivement à prévoir. Il n'est pas utile de recevoir la position du joueur en continu si elle n'a pas changée.
    Mais si je comprend bien, ce serait une bonne idée d'utiliser des chaînes de caractères sérialisées en json ? Pour l'instant c'est ce que je fait mais je doit effectivement ajouter un caractère tels que ' / ' pour séparer les paquets et quand je les reçois j'utilise la fonction split. Je gère tout de même les erreurs qui pourraient survenir car j'ai pu constater que les paquets sont divisés de tels sorte:

    Paquet 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"position":{"x":0,"y":0}}/{"position":{"x":3,"y":1}}/{"position":{"
    Paquet 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x":3,"y":1}}/{"position":{"x":3,"y":1}}/{"position":{"x":3,"y":
    Peut-être que je me trompe où que c'est à moi de gérer cela mais je ne sais pas si je m'y prend correctement.

    Ensuite, je ne comprend pas ce que signifie "rédiger un protocole". Justement, c'est ça ma question. Comment faire pour échanger des données de manière fiable?
    N'existe-t'il pas déjà des protocoles plus haut niveau qui pourraient m'aider où est-ce que Tcp est suffisant car les opérations que je tente d'effectuer ne sont pas trop spécifique?

    Encore une fois, merci.

  5. #5
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Points : 704
    Points
    704
    Par défaut
    ici par protocole on entends "construire une langue où le client et le serveur utiliserons" et non pas protocole réseau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"position":{"x":0,"y":0}}
    en est une, une autre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <position>
    	<x>0</x>
    	<y>0</y>
    </position>
    une autre et encore une autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <position>
    	<x value=0></x>
    	<y value=0></y>
    </position>

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Citation Envoyé par Filadelphila Voir le message
    Peut-être que je me trompe où que c'est à moi de gérer cela mais je ne sais pas si je m'y prend correctement.
    C'est à vous de gérer cela.
    Le soucis étant que le caractère '/' que vous utilisez comme séparateur de vos "messages" peut être contenu dans le message...

    Ensuite, je ne comprend pas ce que signifie "rédiger un protocole". Justement, c'est ça ma question. Comment faire pour échanger des données de manière fiable?
    N'existe-t'il pas déjà des protocoles plus haut niveau qui pourraient m'aider où est-ce que Tcp est suffisant car les opérations que je tente d'effectuer ne sont pas trop spécifique?
    TCP vous garantit seulement que les bytes arrivent dans l'ordre dans lequel ils ont été transmis.
    Maintenant, si la connexion se coupe/ralenti, il va falloir savoir quoi faire pour reprendre (ou pas) le dialogue là où il s'est interrompu.
    • HTTP est un exemple de protocole utilisé par les navigateur Web pour récupérer des pages Web.
    • SMTP est le protocole utilisé pour échanger des mails.

    HTTP et SMTP sont des protocoles des applications qui vont utiliser TCP pour réaliser des applications particulière.
    Rien n'empêche de partir sur un serveur HTTP avec lequel on échange des paquets/messages JSON (plutôt que du HTML).
    C'est vous qui décidez.

    - W

  7. #7
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Points : 704
    Points
    704
    Par défaut
    autant pour moi je pensais aux websocket , qui reconstituent le trame à partir de plusieurs morceaux

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par flapili Voir le message
    autant pour moi je pensais aux websocket , qui reconstituent le trame à partir de plusieurs morceaux
    Les websockets sont une sorte d'extension d'HTTP (le web) pour permettre au serveur de pousser des données vers le client (mettre à jour l'affichage au fur et à mesure que de nouvelles données arrivent).

    - W

Discussions similaires

  1. [MySQL] Comment gérer les ' et " dans une table pour exporter en excel
    Par morgan47 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/11/2011, 19h42
  2. Base de données pour un serveur (de jeu)
    Par coyotte507 dans le forum Décisions SGBD
    Réponses: 16
    Dernier message: 15/07/2010, 19h15
  3. Insérer/gérer son protocole TCP/IP, non-http
    Par balibalo dans le forum Wildfly/JBoss
    Réponses: 6
    Dernier message: 29/08/2008, 17h18
  4. Réponses: 1
    Dernier message: 22/06/2007, 15h39
  5. [Protocole TCP] Utilitaire pour Tracer une session
    Par =JBO= dans le forum Développement
    Réponses: 3
    Dernier message: 04/06/2005, 19h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo