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 :

echange de donnees clients/clients avec les sockets


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut echange de donnees clients/clients avec les sockets
    Salut a tous

    Je suis entrain de realiser une application java qui fonctionne en reseau grace aux sockets
    j'ai deja reussi a etablir une connexion entre le serveurs et les differents clients mais etant relativement novice en java et totalement debutant avec les sockets , je ne sais pas comment faire l'echange de donnees entre 2 clients
    Je pense qu'il faut faire transiter les donnees par le serveur ,mais voila lorsqu'un client envoie des donnees au serveur,celui ci les recoit bien mais il envoie une reponse a ce meme client et non aux autres
    et donc je voudrais savoir comment realiser l'echange des donnees entre 2 ou plusiseurs clients

    Merci d'avance pour vos reponses

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Quand le serveur écrit sur une socket, il envoie au client de l'autre coté de cette socket. Si le serveur veux envoyer à tous les clients, il doit écrire sur chacune des sockets le message. Le client ne peux pas envoyer aux autres clients directement, c'est au serveur de le faire.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Dans ce cas comment faire pour que le serveur envoie a un client ce qu'il a reçu d'un autre client ?
    Il y a-t-il un moyen de changer le socket au quel le serveur doit repondre ?
    De tel sorte qu'il ne reponde pas a celui qui a ecrit mais a un autre client ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    y a rien à changer. Si ton serveur a reçu deux connections, tu dois avoir deux objets sockets, à toi de les gérer correctement. Normalement, tu dois avoir autant d'objets Socket que tu n'a reçu de connection au serveur. Sur chaque socket tu as un outputStream dans lequel tu peux écrire tes datas pour ce client là.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Déjà merci pour tes réponses j'ai donc décider de stocker tous les Sockets dans une Arraylist après chaque connexion ( après chaque appel de la méthode accept() je sauvegarde le nouveau socket dans ma liste) .Puis lors de l'envoi des données, je fais un envoi pour chaque socket contenue dans ma liste , je me disais qu'avec ça le serveur enverrait mon objet a chaque client mais non il ne l'envoi toujours qu'a celui qui a envoyé le message .
    Comment faire alors pour envoyer les données a chaque socket si même en faisant un envoi sur chaque socket ça ne marche pas

    Merci

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    montre ton code.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Ma classe d'envoi de donnees cote serveur

    Code : 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
    37
    38
    39
    public class Emission implements Runnable{
    	Joueur J;
    	Carte c;
    	ObjectOutputStream Oout;
    	String nom;
    	Socket socket;
    	ArrayList<Socket> listeSocket;//liste contenant tous les sockets accpetes pasr le serveur
    	Emission(ArrayList<Socket> listeSocket,Socket socket,String nom ,Joueur J, Carte c)
    	{
    		this.listeSocket = new ArrayList<Socket>(listeSocket);
     
    		this.nom = new String (nom);
    		this.socket = socket;
     
    		this.c = new Carte (c);
    		this.J = new Joueur (J);
     
    	}
     
    	public void run()
    	{
    		try
    			{
    				for(int i =0; i<listeSocket.size();i++)
    				{
    					Oout = new ObjectOutputStream(listeSocket.get(i).getOutputStream());
     
    					this.Oout.writeObject(J);
    					Oout.flush();
     
    				}
    			}
    		catch(IOException e)
    		{
    			e.printStackTrace();
    		}
     
    	}
    }
    et celle de reception des donnees cote Client

    Code : 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
    37
    38
    import java.io.*;
    import java.net.*;
     
     
    public class Reception implements Runnable{
    Joueur J;
    Carte c;
    Socket socket;
    ObjectInputStream Oin=null;	
    	Reception (Socket socket, String nom){
    		this.socket = socket;
    	}
     
    	public void run()
    	{
    		try
    		{
    			Oin = new ObjectInputStream(socket.getInputStream());
     
    			while(true)
    			{	
    				System.out.println("Reception d'un nouveau joueur");
    				J =	new Joueur((Joueur)this.Oin.readObject());
     
    				System.out.println(J);
    			}
    		}
    		catch(IOException e)
    		{
    			e.printStackTrace();
    		}
     
    		catch (ClassNotFoundException e)
    		{
    			e.printStackTrace();
    		}
    	}
    }

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    On peux voir l'appel à Emission? Aussi, les ObjectStream, c'est peut être pas l'idéal pour de la connexion réseau...

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je ne vois nulle part d'ajout de socket dans la liste des sockets. Si tu n'ajoutes pas les nouvelles connexions, elles ne sont pas concernées et ça ne marche pas, évidemment -_-°...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Voici l'appel a l'emission

    Code : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import java.io.*;
    import java.net.*;
    import java.util.ArrayList;
     
     
    public class Reception implements Runnable{
    Joueur J;
    Socket socket;
    Thread t3;
    ObjectInputStream Oin=null;
    String nom;
    ArrayList<Socket> listeSocket;//liste contenant tous les sockets accpetes pasr le serveur
     
     
    	Reception ( ArrayList<Socket> listeSocket,String nom, Socket socket) 
    	{
    		this.listeSocket =new ArrayList<Socket>(listeSocket);
     
    		this.nom = nom; 
    		J = new Joueur(nom);
    		this.socket = socket;
     
    	}
     
     
    	public void run()
    	{
    		try
    		{			Oin = new ObjectInputStream(this.socket.getInputStream());
    			while(true)
    			{
     
     
    				J =	 new Joueur((Joueur)this.Oin.readObject());
    				//c = (Carte)this.Oin.readObject();
    				System.out.println(J);
    				J.augmenterArgent();
     
     
    				this.t3 = new Thread(new Emission(listeSocket,socket, nom ,new Joueur(nom), new Carte( Chiffre.N10, Couleur.pique)));
    				t3.start();
    			}
    		}
    		catch(IOException e)
    		{
    			e.printStackTrace();
    		}
     
    		catch (ClassNotFoundException e)
    		{
    			e.printStackTrace();
    		}
    	}
    }

    En ce qui concerne les ObjectsOutputStream , je ne connais pas d'autre solution pour envoyer mes objets
    si tu as conseil a me donner a propos je l'accepterai volontier


    Edit: Pardon j'ai envoyé le mauvais bout de code mais la je l'ai édité donc c'est ok

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    J'ai du mal là à comprendre la logique de ton code. Mais de toute façons on tourne en rond là, on ne vois toujours pas où tu remplis ta liste de Socket. Montre nous le code à partir du receive qu'on voie ce que tu fais.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Desole pour le retard
    Voici le code ou j'insere les sockets dans ma liste
    Code : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    import java.net.*;
    import java.util.ArrayList;
    import java.io.*;
     
    public class Connexion implements Runnable {
     
    	ServerSocket servertsocket=null;
    	Socket socket = null;
    	private BufferedReader in;
    	Thread t1;
    	ArrayList<Socket> listeSocket;//liste contenant tous les sockets accpetes pasr le serveur
     
    	public Connexion( ArrayList<Socket> listeSocket, ServerSocket serversocket)
    	{	
     
    		this.listeSocket =new ArrayList<Socket>();
    		this.listeSocket.addAll(listeSocket);
     
     
    		this.servertsocket=serversocket;
    	}
     
    	public void run()
    	{
    		try 
    		{	 
     
     
     
    			 while(true)
    			 {
    				 this.socket = this.servertsocket.accept();
     
    				 this.listeSocket.add(socket);
     
     
    				 t1 = new Thread (new Authentification(listeSocket,this.socket));
    				 t1.start();
    			 }
    		}
    		catch ( IOException e)
    		{
    			System.out.println("Erreur connexion echouee");
    		}
    	}
     
    }
    Bon finalement j'ai réussi a le faire marcher
    Mais j'ai un nouveau problème, les ObjectOutputStream sont re-déclares a chaque appel de la classe Emission
    et donc lorsque j'essai de les reutiliser pour envoyer de nouveaux objets je reçoit une erreur de la part du compilateur:
    "java.net.SocketException: Connection reset"

    Devrais-je aussi créer une liste ObjectOutputStream qui contiendra les ObjectOutputStream de chaque socket ?ainsi il ne seront déclarés qu'une seul fois juste après l'ajout de la nouvelle socket dans la liste de Socket .
    Est ce une bonne idée de procéder de la sorte ? Merci d'avance et désolé si je n'ai pas été bien clair

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu devrais surtout oublier les ObjectOutputStream, et transférer directement tes datas Tu va galérer avec des OOs. T'as le problème qu'il faut garder le flux ouvert, t'as le problème qu'il faut faire gaffe à ne jamais modifier un objet après que tu l'a envoyé, t'as le problème que tant qu'il est ouvert, les objet envoyé par une partie occupent la mémoire des deux cotés sans être nettoyable, ....

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Ok mais alors je devrais envoyer mes donnees (les attributs de l'objet ) une par une ? parce qu'a part cette solution je ne vois pas comment envoyer un objet sans utiliser ObjectOutputStream

    Mais t'as totalement raison pour les ObjectOutputStream je sais pas combien de problèmes de flux ouvert j'ai déjà eu avec eux jusqu’à présent donc une autre solution m’intéresse vraiment

    En tous cas merci pour tes indication elles etaient super utiles

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    T'as pas besoin d'envoyer des objets, t'as besoin d'envoyer des messages. String, numéro d'id de l'utilisateur qui le dit, et puis voilà.
    Après, si t'as besoin d'ajouter des trucs comme la date d'envoi, le style de texte ou que sais-je, oui, bon, ça commence à faire beaucoup de choses à se taper à la main. Mais de toute façon tu as pas besoin d'envoyer l'objet entier, alors ça se discute pas vraiment.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Ok je vois

    Bon mais si a l'avenir j'ai besoin d'envoyer des objets par les sockets ,il y a-t-il une autre solution que je pourrai utiliser?

    En tous cas mercipour votre aide et vos indications je marque le sujet comme resolu

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La question c'est pourquoi tu as besoin d'envoyer des "Objet" par socket. Ce n'est pas l'objet qui est envoyé au final, mais ses données qui servent à reconstituer un autre objet de l'autre coté. L'inconvénient d'ObjetOutputStream c'est qu'il n'envoie jamais deux fois un même objet, qu'il garde tout ce qui lui est passé en mémoire (risque de fuite) et que le protocole n'est pas standardisé à ma connaissance (à priori, il peut varier d'une jvm à une autre). Donc c'est très bien pour persiter un court moment des objets que tu dois relire avec la même jvm, mais pas pour de la communication entre des jvm de version et de constructeur différentes. Il est préférable que tu établisse un protocole standardisé. Si vraiment tu veux travailler au niveau de la couche objet, il y a tout l'artillerie de RMI, mais c'est vachement plus avancé et çà sert à avoir des état synchrones entre les différentes machines. Il y a aussi l'option d'utiliser des outils permettant de convertir tes objets en JSON, xml ou autre et envoyer ça, mais ça prendra plus de place.

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

Discussions similaires

  1. Architecture Client/Serveur avec les SOCKET
    Par Zodiark dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2011, 14h11
  2. application client-serveur avec les sockets
    Par matheo600 dans le forum C++
    Réponses: 1
    Dernier message: 20/04/2008, 17h21
  3. communication client serveur avec les sockets
    Par timtima dans le forum Linux
    Réponses: 2
    Dernier message: 07/11/2007, 10h23
  4. application client/serveur avec les sockets
    Par baya1 dans le forum JBuilder
    Réponses: 1
    Dernier message: 24/02/2007, 15h37

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