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

Entrée/Sortie Java Discussion :

[Socket] Multithreaded Server


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Points : 493
    Points
    493
    Par défaut [Socket] Multithreaded Server
    Bonjour,

    je dois réaliser une petite application client server. Le serveur doit être multitask et les clients doivent être threader.

    J'ai lu pas mal de document à ce sujet mais le modèle est pour moi encore un peu flou. Voici ce que je sais :

    • Server.java : On créer un nouveau ServerSocket et dans une boucle infinie, on attent les connection des clients. (méthode bloquante accept()). Dès que l'on a un client, je créer une instance de protocole en lui passant le socket client puis je créer un thread avec comme paramètre l'objet protocole. Je lance le thread.
    • Client.java : Créer un nouveau socket vers le server. Peut lire et écrire sur le stream
    • Protocole.java : impemente Runnable


    Mais ensuite je ne comprend pas plus le rôle du protocole. Maintenant je désire par exemple que deux clients s'envoient un message String. Comment faire et surtout quel est le rôle du protocole dans cette communication client à client ?

    merci de votre aide
    Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    En fonction du nombre de client et du mode "connecté" ou "déconnecté" de ton protocole, tu devrais plutôt utiliser un pool de thread plutôt qu'un nouveau thread systématiquement.

    Le protocole vise à gérer les différentes "étapes" de l'échange. Il contrôle également la conformité des échanges.
    Dans une communication il y a un formalisme et des règles à respecter pour que tout le monde se comprenne. C'est le rôle de ton protocole.
    Wikipedia

    Dans ton cas par exemple, il s'agit de déterminer quand est-ce que le premier client a fini de parler pour que le deuxième puisse répondre. Et inversement.

    EDIT: Pour en revenir au mode "connecté".
    En mode "connecté", on utilise la même socket tout au long de l'échange.
    En mode "déconnecté", on utilise la socket pour une étape du protocole et on la ferme.

    Dans ton exemple, le client envoie un message au serveur, le serveur répond et ferme la socket. Le client devra "ouvrir" une nouvelle socket pour envoyer un nouveau message. C'est un moyen simple de limiter le nombre de thread actif.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Points : 493
    Points
    493
    Par défaut
    merci pour ta réponse. Maintenant j'aimerai faire quelque chose de simple. Jai mon serveur qui tourne et qui attend les clients.

    Dès qu'un client se connecte, j'aimerai que le serveur envoit un message de confirmation de connection au client. Quel est le rôle du protocole dans cet échange ?
    Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 182
    Points : 268
    Points
    268
    Par défaut
    en faites la classe que tu nomme protocole, cest dans cette classe que tu va decider quoi faire quand un client envoie ceci ou cela. chaque instance de protocole est un thread composer du socket qui gere un de tes clients si jai bien compris.

    tout ce que tu doit faire cest inventer un mini protocol exemple quand le client tenvoie "c" sa signifie qu'il vient de se connecter donc le serveur envoie bonjour disons.

    un exemple tres simple qu'on voit souvent cest la premiere lettre de l'envoie indique le type du message envoyer par le client, donc tu "coupe" la premiere lettre si cest a+message fait ceci, si cest b+message fait cela... evidamment cest un exemple tres simpliste.

    dans ta methode run() de ta classe protocol tu va faire une boucle infinis while(true) et recuperer ce que le client tenvoie avec disons un BufferedReader ou ce que tu veux utiliser.

    j'espere avoir pu t'aider.

  5. #5
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Citation Envoyé par cyrill.gremaud Voir le message
    Dès qu'un client se connecte, j'aimerai que le serveur envoit un message de confirmation de connection au client. Quel est le rôle du protocole dans cet échange ?
    Comme nous te l'avons expliqué, la (ou les) classe(s) "protocole" sont là pour vérifier le bon déroulement du protocole, effectuer les traitements adéquates et enfin envoyer la réponse qui convient.

    Tu auras sûrement une (ou plusieurs) classe(s) "protocole" pour le serveur ET le client.

    La première étape est donc de spécifier le protocole de communication.
    Pour information dans la plupart des protocoles, le serveur commence toujours sa réponse par un code retour.
    Pour modéliser tout ça, il convient en général de faire des diagrammes d'état/activité/objet et de séquence.

    Citation Envoyé par javan00b Voir le message
    dans ta methode run() de ta classe protocol tu va faire une boucle infinis while(true)
    Il vaut mieux prévoir une condition de sortie, sinon c'est qu'il y a un problème dans le protocole.
    Un cas tout simple c'est la fermeture d'un des flux de la socket.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Problème de communication socket (Client->Server)
    Par Julien_C++ dans le forum C++Builder
    Réponses: 6
    Dernier message: 21/05/2007, 21h28
  2. Socket multithread & select
    Par crealinks dans le forum Réseau
    Réponses: 3
    Dernier message: 22/11/2006, 21h36
  3. MultiThread Server
    Par Wurlitzer dans le forum Oracle
    Réponses: 9
    Dernier message: 02/06/2006, 14h23
  4. [Socket][Client/Server]Exception d'origine inconnue
    Par willowII dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/11/2005, 22h36
  5. bloquage socket multithread
    Par aderick dans le forum Développement
    Réponses: 1
    Dernier message: 02/12/2004, 10h10

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