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 :

Messagerie instantanée en socket java


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut Messagerie instantanée en socket java
    Bonjour je realise une application de messagerie instantanée en java en utilisant les socket.

    J'arrive a conecter mes clients au serveur et a envoyer des messages.

    Le probleme est que je voudrais envoyer les messages entre client; C'est a dire qu'un client envoi son message au serveur et que celui ci ne le renvoi qu'au destinataire concerné.

    est ce que cela est possible? si oui comment dois-je proceder?

    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Points : 85
    Points
    85
    Par défaut
    Je pense que tu dois mettre en place un service utilisant JMS (Java Message Service).

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Il suffit dans ton message, de spécifier le client à qui tu veux envoyer ce message.
    Sur le serveur, tu identifies ce client et tu n'envoies le message qu'à lui.

  4. #4
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Comment je fais pour specifier le client qui doit recevoir le message?

    Et comment je peux l identifier sur le serveur?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ca dépend comment tu construis tes messages.
    Si c'est une simple chaine de caractères, il va te falloir une sorte de protocole, avec par exemple en debut de chaine, l'identifiant de client.
    Si tu passes directement des objets par sérialisation, tu peux ajouter un champ correspondant à un id.
    Ton serveur devra posséder cet identifiant pour raccrocher le message au bon client.
    C'est plus clair ?

  6. #6
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Je trasmet des simples chaine de caractere. Je vois ce que tu veux dire mais je n'ai pa la moindre idée de comment mettre un identifiant en debut de chaine De plus cet identifiant devrait etre mis automatiquement il ne faut pas que l utilisateur ait a le saisir. Pourrais tu me donner la demarche a suivre ou alors un exemple ? merci

  7. #7
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Ou encore, si tu as du temps et envie de t'amuser, tu peux faire en sorte que le client se connecte directement au client avec lequel il veut discuter en privé.
    Le client émetteur demandera donc les infos de connexion au serveur, puis il se connectera au client récepteur. Le client récepteur doit évidemment se transformer en serveur.
    Il y a donc moyen de faire des trucs rigolos
    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.

  8. #8
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Si je comprends bien il faut que j instancie un ServerSocket pour le client qui doit recevoir le message puis conecter le client qui envoie le message a ce ServerSocket?

    Mais le probleme reste le meme, comment je fais pour savoir quel est le client qui recevra le message?

  9. #9
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Ben tu peux faire comme dans war3.

    Si l'utilisateur tape son message comme suit:
    il sera envoyé à tout le monde

    Si l'utilisateur tape son message comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /w <destinataire> blablabla
    il sera envoyé qu'au destinataire.

  10. #10
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    En faite mon probleme est surtout que je ne vois pas comment faire pour identifier le destinataire (autrement dit la socket concerné).

    Comment je fais cela? y a t il une methode specifique?

    voici mes classes

    classe 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
     
     
    public class client  {
     
    	Socket soc;
     
    	public void connexion() throws IOException{
     
    		try{
     
    		InetAddress ip = InetAddress.getByName("192.168.1.36");
    		System.out.println("Adresse ip du serveur : " + ip);
    		soc = new Socket (ip, Server.port);
     
    			System.out.println("Socket : " + soc);
    			BufferedReader entree = new BufferedReader(
                        new InputStreamReader(
                       	     soc.getInputStream()));
     
                PrintWriter sortie = new PrintWriter(
                      new BufferedWriter(
                         new OutputStreamWriter(
                      		 soc.getOutputStream())),true);
     
                String msg = entree.readLine();
    			System.out.println(msg);
     
     
    		}catch (Exception e) {
     
    			e.printStackTrace();
    			//System.out.println(e);
     
    		}
    	}
     
     
    }
    classe server :

    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
     
     
    public class Server {
     
    	static final int port = 8080;
     
    	public static void main (String [] args){
     
     
    		int num = 1;
     
    		try{
     
    			ServerSocket srv = new ServerSocket(port);
    			System.out.println("Démarré " + srv);
    			while (true){
     
    				Socket conect = srv.accept();
    				System.out.println("Connexion accepté : " + conect);
    				new ServerThread (conect, num++).start();
     
    			}
     
    		}catch (Exception e){
     
    			System.out.println(e);
     
    		}
    classe ServerThread :

    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
     
     
    public class ServerThread extends Thread {
     
    	private Socket conect;
    	private int num;
     
    	public ServerThread(Socket conect , int num){
     
    		this.conect=conect;
    		this.num=num;
     
    	}
     
    	public void run (){
     
    		try{
     
    			BufferedReader reception = new BufferedReader(
    	                new InputStreamReader(
    	                 	 conect.getInputStream())
    	                           );
     
    	        PrintWriter envoi = new PrintWriter(
    	                new BufferedWriter(
    	     		        new OutputStreamWriter(
    	                     	conect.getOutputStream())), true);
     
    	        envoi.println("bonjour, saisir stop pour arreter");
    			String msg = reception.readLine();
    			while(!(msg.equals("stop"))){
     
     
    				envoi.println(msg);
     
    			}
    			conect.close();
     
    		}catch (Exception e){
     
    			System.out.println(e);
     
    		}
     
     
    	}
     
    }
    Je pensait qu'avec le numero du ServerThread je pouvait le faire mais je n y arrive pas.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Ne touche surtout pas aux numéros de Threads. Non pas que ce soit dangereux, mais simplement que la solution n'est pas du tout là.

    En fait, tu dois construire un protocole de discussion. Envoyer un message à un serveur ne suffit pas : il faut également envoyer des données pour traiter le message.

    Par exemple, si je prends le protocole ouvert IRC, on peut voir qu'il est géré par connexions :

    Quand je parle de client ici, je parle d'application cliente, pas d'utilisateur final.

    Client A se connecte à Serveur Z
    Client A dit à Serveur Z : Je suis A
    Serveur Z dit à Client A : Ok, ton nom n'est pas pris, je te connais en tant que A.
    Serveur Z dit à tout le monde : A vient d'arriver.
    Serveur Z dit à Client A : voici la liste de tous ceux qui sont connectés : C, D.
    Client B se connecte à Serveur Z
    Client B dit à Serveur Z : Je suis B
    Serveur Z dit à Client B : Ok, ton nom n'est pas pris, je te connais en tant que B.
    Serveur Z dit à tout le monde : B vient d'arriver.
    Serveur Z dit à Client B : voici la liste de tous ceux qui sont connectés : A, C, D.
    Client B dit à Serveur Z : Envoie le message "Salut à tous !" à tout le monde
    Serveur Z dit à Clients A, C, D : B envoie le message "Salut, ça va ?".
    Client A dit à Serveur Z : Envoie le message "Salut, ça va ?" à B.
    Serveur Z dit à Client B : A envoie le message "Salut, ça va ?".
    Client B dit à Serveur Z : Envoie le message "Oui, et toi ?" à A
    Serveur Z dit à Client A : B envoie le message "Oui, et toi ?".


    Pour mettre en place cette communication, tu vas devoir définir un format de messages qui serviront à faire passer toutes ces commandes. C'est un peu difficile pour comprendre au début, mais ça ira vite, tu verras !

  12. #12
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Cela me semble une bonne idée, par contre pour le mettre en place sa me semble tres difficile.

    Je vais googelisé un peu sa et essayer de le mettre en place

    Merci.

  13. #13
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Je pense etre sur la bonne voie mais pour eviter de m egarer je prefere poser la question.

    Par exemple pour que "Client A dit à Serveur Z : Je suis A" je peux dans la classe client modifié la variable "msg" comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
                InetAddress clt = InetAddress.getLocalHost();
                String msg = "envoi de " +  clt;
                msg =msg + " " + entree.readLine();
    Est ce que c'est cela qu'il faut faire?

  14. #14
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le mieux est de demander à l'utilisateur un nickname. C'est ensuite cette chaine que tu vas transmettre au serveur, plutôt que son IP.
    Côté serveur, il te faut une Map qui relie un nickname et le Thread qui s'occupe du client.
    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.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par nzo70 Voir le message
    Par exemple pour que "Client A dit à Serveur Z : Je suis A" je peux dans la classe client modifié la variable "msg" comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InetAddress clt = InetAddress.getLocalHost();
    String msg = "envoi de " +  clt;
    msg =msg + " " + entree.readLine();
    Est ce que c'est cela qu'il faut faire?
    Oui, c'est à peu près ça... c'est d'ailleurs ce que te proposais fr1man :
    Citation Envoyé par fr1man Voir le message
    Si c'est une simple chaine de caractères, il va te falloir une sorte de protocole, avec par exemple en debut de chaine, l'identifiant de client.

    En gros :
    Tu ne peux pas te contenter d'envoyer le message "Salut !" à ton serveur, sinon celui-ci n'aura aucun moyen de savoir à qui ce message est destiné. Il faut ajouter au message des métadonnées, c'est-à-dire des informations supplémentaires qui expliquent ce que contient le message (provenance, destination, type, ...)
    De plus il n'y a pas que les messages de discussion qui doivent circuler, il y a aussi des messages de connexion, déconnexion, changement de pseudo, etc. Tout dépend des possibilités que tu veux offrir dans ton appli.
    D'où la nécessité de définir un protocole, c'est-à-dire de définir le format des messages et l'ordre dans lequel ils doivent être échangés...

    Tu peux par exemple décider que les messages de discussion auront la forme "msg;<provenance>;<destination>;<message>", les messages de changement de pseudo "chg;<pseudo>;<nouveaupseudo>"...
    Si je m'appelle "bli" et que j'envoie "coucou" à "bla", puis que je décide de m'appeler "blu", puis que j'envoie "recoucou" à "bla", le serveur recevra les messages "msg;bli;bla;coucou" puis "chg;bli;blu" puis "msg;blu;bla;recoucou" et saura comment interpréter et traiter correctement chacun d'entre eux.

    Si tu utilises des séparateurs (dans mon exemple, les points virgules) pour bien différencier les différents champs des messages, pense à encoder les textes ou à interdire certains caractères pour ne pas confondre les "vrais" séparateurs et les caractères tapés par un des utilisateurs...

  16. #16
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    et je defini le protocole des message comment? si je le met que ton exemple je vais avoir une erreur de compilation non?

  17. #17
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par nzo70 Voir le message
    et je defini le protocole des message comment? si je le met que ton exemple je vais avoir une erreur de compilation non?
    C'est toi qui définis ton propre protocole.
    C'est à toi de coder, dans ton serveur, l'analyse des chaines que tu vas recevoir. Dans le serveur, il te faudra donc découper la chaine complète reçu, puis interpréter chaque morceau pour savoir quoi en faire.
    Le client devra construire une chaine spécifique pour chaque action à effectuer. C'est à toi de coder la construction des chaines à envoyer.
    Il te faut donc d'abord réfléchir avec un papier et un stylo aux différents types de messages que le client peut envoyer/recevoir et que le serveur peut envoyer/recevoir. C'est ça, un protocole de communication.

    C'est plus clair ?
    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.

  18. #18
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    oui c'est plus clair merci.

  19. #19
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Points : 380
    Points
    380
    Par défaut


    Je ferais mieux de finir mon API au plus vite, je bosse justement sur ce genre de bêtises réseaux qui font galérer pas mal de monde.

    J'essaie de le faire avec les channels et selector en monothread, ça à l'avantage d'avoir un code réutilisable en grande partie quelque soit le protocole ou service.

    C'est un travail d'assez longue haleine (surtout pour l'étudiant peu qualifié que je suis), surtout que les docs ne sont pas des plus simples à comprendre dans le paquet java.nio.

  20. #20
    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 : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Salut,

    au passage, deux messages que j'avais postés pour donner une idée d'architecture de petite lib réseau : ici.
    Ca pourra peut-être te donner quelques idées.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. messagerie instantanée et sockets
    Par Spidy dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 13/05/2010, 21h34
  2. API de communication par messagerie instantanée en JAVA
    Par mbinte dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 10/05/2010, 12h09
  3. [Net]socket java
    Par georges25 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 13/02/2006, 16h22
  4. [Net][Débutant(e)] socket c <-> socket java
    Par JulienT dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 25/11/2005, 16h46

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