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 :

SocketServer et multiuser


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut SocketServer et multiuser
    Bonjour,

    j'essaye de faire un chat multi-utilisateur.

    La structure est la suivante : un utilisateur se connecte à un serveur via un Socket(IP/port) puis le serveur créé un objet thread (Client) afin de gerer cet utilisateur à part. L'objet Client ouvre un nouveau ServerSocket qu'il transmet à l'utlisateur (le port du SreverSocket) puis ferme la connection afin de libérer le port et attend l'utilisateur sur le nouveau port. L'utilisateur lui recoit le port, se connecte au Socket Client et ferme la premiere connection avec le serveur.

    De cette manière le Serveur dispose de nouveau de son port afin d'accueillir un futur utilisateur... Cependant cela ne fonctionne pas, j'utilise des .close() qui ne generent pas d'erreur et je fais des tests avec des isClosed() tout semble bon.

    J'effectue tout mes tests en local, est ce que cela peut poser un problème ?

    Mon problème est :
    Lorsque je désire connecter un second utilisateur une erreur sort toujours :
    Already in use . pourquoi ? En plus, même si je fais une simple attente avec un .accept puis un .close() au niveau du serveur de l'objet connecté sur le port. Et le .close du coté utilisateur aussi...


    Je suis allez voir beaucoup de chat deja tout fait sur internet et je ne comprend peut etre pas bien comment fonctionne l'allocationet la liberation des ports.

    Merci de votre réponse

  2. #2
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut chat multi-cast
    l'allocation des ports pour un "chat" est à méditer... A mon avis, chaque utilisateur générera une nouvelle connexion permanente avec le serveur. C'est pourquoi tu dois imaginer que chaque porte correspond à chaque utilisateur avec pour chacun d'eux une instance différente du serveur et du client, i.e. une connexion serveur-client différente et attachée au Thread du "chat".

    schématiquement je verrais: output <- "chat multi-cast" <-> serveurs[] <-> clients[] <- input

  3. #3
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    moi j'aurais fais comme toi pdesoil ... avec il me semble du multi-thread pour les connexions établies (donc un peu comme broumbroum aussi )

    Tu peux nous montrer comment tu libères ton socket de connexion "principale" au niveau serveur ?

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    J'ai déjà fait un chat multiutilisateurs dans le cadre de ma formation d'ingé, et je peux te dire que la classe ServerSocket ne monopolise pas le port si tu fais du multithread.
    En gros voici le principe :
    Le serveur crée un ServerSocket et fait une boucle.
    Dans cette boucle tu récupère un Socket via Socket sockClient=monServerSocket.accept();
    Ensuite c'est là que tu crées un Thread clientThread avec le socket récupéré précédemment.
    Puis ça recommentce la boucle. Le thread permet de ne pas bloquer ton serverSocket pendant la discussion avec le client puisque celle-ci se fait via le socket issu du accept.

    Le seul genre de monopolisation que tu peux avoir, c'est un nombre de clients supérieur au nombre total de ports disponibles sur ta machine ( environ 65000 ! ). Si dans ton appli un tel nombre de clients doivent se connecter simultanément, tu dévras gérer des files d'attente en envoyant par exemple lors de la création de la requete client "je suis saturé, réssayez plus tard".

    J'espère avoir été à peu près claire...

  5. #5
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    Le seul genre de monopolisation que tu peux avoir, c'est un nombre de clients supérieur au nombre total de ports disponibles sur ta machine ( environ 65000 ! ).
    J'ai peut-etre mal compris mais ça rentre en contradiction avec ton principe nan ? Si c'est multithreadé, le nombre de port dispo n'intervient pas puisque ton serveur communique par un seul port .
    Le problème vient plus de la limitation en thread (quelque centaines), et il faut passer en monothreadé (avec une methode non bloquante (nio)) mais là je crois que c'est chaud au niveau de l'architecture et ça mange du temps cpu

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Renseignes toi sur mina et les exemples fournis.
    Tu gagneras du temps.
    http://mina.apache.org/

  7. #7
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par orelero
    J'ai peut-etre mal compris mais ça rentre en contradiction avec ton principe nan ? Si c'est multithreadé, le nombre de port dispo n'intervient pas puisque ton serveur communique par un seul port .
    Le problème vient plus de la limitation en thread (quelque centaines), et il faut passer en monothreadé (avec une methode non bloquante (nio)) mais là je crois que c'est chaud au niveau de l'architecture et ça mange du temps cpu
    Non je maintiens ce que j'ai dit.
    Ok il n'y a qu'un seul port utilisé en écoute, celui du serverSocket, mais à chaque "accept", une socket est créé avec un port. C'est comme ça que tu le veuille ou non. Ce port pour la socket étant un port de type client, son numéro est attribué de manière plus ou moins aléatoire par le système d'exploitation ( dans la liste des ports non utilisés par la machine, il me semble d'ailleur que c'est compris entre 1024 et 65000 ). Tu peux identifier le numéro via la méthode getPort de Socket, ou bien taper un netstat dans la console.

Discussions similaires

  1. D7, paradox multiUsers
    Par Arrnno dans le forum Bases de données
    Réponses: 9
    Dernier message: 01/09/2006, 11h11
  2. Réponses: 4
    Dernier message: 03/08/2006, 16h27
  3. Base de données ACCESS 2003 : multiusers
    Par LapinGarou dans le forum MFC
    Réponses: 1
    Dernier message: 05/04/2006, 13h49
  4. [socketserver]
    Par let_me_in dans le forum Web & réseau
    Réponses: 5
    Dernier message: 28/03/2006, 10h15
  5. Réponses: 4
    Dernier message: 08/11/2005, 21h19

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