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

Java Discussion :

Serveur multi clients


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut Serveur multi clients
    Bonjour.

    Je veux réaliser un serveur où plusieurs clients peuvent se connecter. J'ai un fichier Serveur.java et Client.java. Je travaille sous Eclipse (en lançant plusieurs sessions).
    Lorsqu'un client écrit un message, ça doit l'envoyer au serveur qui ensuite renvoie ce message à tous les autre clients.
    Des le début ça bloque : si un client écrit un message, le premier est envoyé au serveur (mais uniquement au serveur) et si le client écrit un 2ème message là il y a une erreur : java.io.EOFException.
    J'ai pu isoler la ligne où apparaît l'erreur : dans le fichier Serveur.java, dans la fonction run(), il s'agit de la ligne ois.close();

    J'aimerais que vous m'expliquiez cette erreur car je ne comprends pas (et si le cœur vous en dit, m'expliquer pourquoi le reste ne marche pas ).

    Voici les deux fichiers en pièces jointes.

    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Si tu fais un close, le flux de la socket est fermé.
    Tu dois repenser correctement ton architecture sur papier avant de te lancer sur le code, parce que là, c'est vraiment le chantier
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut
    Salut ! Merci pour ta réponse. En effet une des erreurs était bien que je fermais le flux (erreur d'inattention sans doute).
    Maintenant j'y suis presque : si il y a 2 clients et que le 1er envoie un message, il faut attendre que le 2ème réponde pour que le message du premier s'affiche ! Et il faut que le 1er réponde au second pour que le message du second s'affiche ! (C'est clair ??)
    Je pars du principe que lorsqu'un message est envoyé le serveur le renvoie à TOUS les clients.

    Voici ce que j'ai modifié dans Serveur.java :
    Code Java :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    	// 5. Lire le message envoyé par le client (méthode bloquante)			
     
    			do
    			{
    				for (int i=0 ; i<nbClients ; i++)
    				{
    					Socket sck1=(Socket)clients.elementAt(i);
    					InputStream is2 = sck1.getInputStream ();
    					ObjectInputStream ois2 = new ObjectInputStream (is2);
    					Object obj2 = ois2.readObject();
    					String msg=(String) obj2;
     
    					// 6. Imprimer le message
    					msg = logins[i] + " : " + msg;
    					System.out.println(msg);
    					//System.out.println("Salut ca va ??");
     
     
    					// 7. Envoyer le message lu à tous les autres clients, le précéder par le login de l'utilisateur concerné
    					// Utilisation de getOutputStream() et writeObject.
    					//System.out.println(nbClients);
    					for (int j=0 ; j<nbClients ; j++)
    					{
    						Socket sck2=(Socket)clients.elementAt(j);
    						OutputStream os = sck2.getOutputStream ();
    						ObjectOutputStream oos = new ObjectOutputStream (os);
    						//if (!sck2.equals(sck1))
    						//{
    							Object obj3 = (Object) msg;
    							oos.writeObject(obj3);
    						//}
    					}
    				}
     
    			}
    			while(true);



    Merci encore et toujours pour votre aide ô combien précieuse (je parle de tous les gens du forums qui prennent sur leur temps pour nous aider ).

    PS : c'est peut être le chantier, mais c'est surtout que je ne maîtrise pas vraiment mon sujet

  4. #4
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par rom117 Voir le message
    si il y a 2 clients et que le 1er envoie un message, il faut attendre que le 2ème réponde pour que le message du premier s'affiche !
    La méthode readObject() est bloquante, donc si dans ta boucle tu es en train d'exécuter readObject() sur le client 1 et que le client 2 est en train d'envoyer des trucs, ceux-ci ne seront pas lu par le serveur tant que tu ne ressors pas de readObject() de client 1, donc que client 1 a écrit quelque chose.

    La méthode n'est pas bonne:

    - avec des sockets classiques, il te faut un thread par connexion de client du côté du serveur: chaque connexion aura son thread associé qui exécutera l'appel à la fonction bloquante (ici readObject). Ainsi quel que soit le client qui émet un message, son thread sera capable de traiter le message indépendamment des autres threads toujours en attente de données des autres clients (donc toujours dans leur fonction bloquante).

    - avec les Selector, et la notion de serveur mono-thread: en gros, on exécute une fonction bloquante sur un seul thread ; l'astuce étant que cette fonction bloquante n'écoute pas l'activité d'une seule socket cliente, mais de toutes celles qu'on a enregistré dans ce selector. Mais pas besoin de détailler plus, ce tuto de la section 'réseau' explique déjà tout en détail

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut
    En effet il doit y avoir un problème à ce niveau-là. Je regarderai ça d'un peu plus près quand j'aurai le temps .
    Merci bien pout ton aide
    Je mets "Résolu" et si j'ai d'autres soucis je reviendrai...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [sockets][UDP][C/C++] serveur multi-clients
    Par l@rry dans le forum Développement
    Réponses: 4
    Dernier message: 08/06/2006, 14h11
  2. serveur multi clients
    Par aaronw dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/03/2006, 09h01
  3. Fork, pthread et serveur multi-clients
    Par Pico10 dans le forum POSIX
    Réponses: 13
    Dernier message: 05/01/2006, 11h48
  4. Serveur Multi-clients
    Par darsky dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/04/2004, 09h53
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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