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

Glassfish et Payara Java Discussion :

WebSocket : Comment ne pas envoyer de message à tous les pairs ?


Sujet :

Glassfish et Payara Java

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 605
    Points : 18 523
    Points
    18 523
    Par défaut WebSocket : Comment ne pas envoyer de message à tous les pairs ?
    Bonjour,

    Je suis en train de développer une application Jee avec plusieurs tableaux collaboratifs.
    Côté javascript le client se connecte comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var websocket = new WebSocket(wsUri);
    Avec wsUri une variable qui contient l'adresse de la WebSocket.

    Côté Java :
    WebSocket JEE avec l'annotation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @ServerEndpoint("/websocket2")
    Quand je veux envoyer un message aux clients, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Session peer : client.getOpenSessions()) {
          peer.getBasicRemote().sendObject(message);
    }
    peer est donné dans la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OnMessage
    public synchronized void message(String message, Session client) throws IOException, EncodeException {
    Comment dois-je m'y prendre pour envoyer des messages uniquement aux utilisateurs concerné ?

    Merci d'avance.
    Au revoir.

    ==============================================
    Edit : j'ai une idée.
    Quand un utilisateur se connecte à un tableau il envoie un message de connexion par websocket.
    Côté Java quand je reçois ce message, je vais mémorisé l'id de la session et la lié avec le tableau sur lequel l'utilisateur vient de se connecter.

    Ensuite je saurai quel session va avec quel tableau.

    Je vais tester ça.

    ==============================================
    Re Edit : Il me manque quelque chose, je ne sais pas qui envoie le message.
    Je ne peux donc pas lié une session à un tableau.

    Faut que je trouve quelque chose d'autre.

    ==============================================
    Re Re Edit :
    Je peux peut être bricoler quelque chose avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @OnOpen
    public void open(Session session, EndpointConfig conf) {
            System.out.println("OPEN SESSION : "+session);
    }
    Apparemment dès qu'un client se connecte cette méthode est appelé.
    Par contre le client n'envoie pas l'id du tableau dans lequel il se trouve lorsqu'il se connecte.

    =============================================
    En utilisant : session.getUserProperties() du côté serveur.
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    room = $('#chatroom option:selected').val();
    wsocket = new WebSocket(serviceLocation + room);
    Comme ici :
    http://www.hascode.com/2013/08/creat...d-glassfish-4/

    Je devrai pouvoir faire quelque chose.

    =============================================

    Ah mais qu'est-ce que je suis con !
    En fait il fallait juste faire :
    Je vais essayer quelque chose.

    =============================================

    Ça pourrait fonctionner, mais en fait non.
    Quand je recharge la page web l'id du Client change vu que je reconnecte la websocket.

    Je ne sais pas comment faire pour ne pas reconnecté la websocket si elle l'est déjà.

    Il faudrait que je suis puisse envoyer des informations quand le client se connecte.
    Keith Flint 1969 - 2019

  2. #2
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Bon en fait ça marche.

    J'avais essayé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var websocket = new WebSocket(wsUri + '["protocol1", "protocol2"]');
    Ça servait à rien, mais en plus ça empêchait Chrome de se connecter, alors que ça fonctionnait sur Firefox.
    Une fois que je me suis rendu compte du problème sous Chrome ça a marché.

    Donc dans la WebSocket côté Java j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private HashMap <String, Integer> sessionTableau = new HashMap <String, Integer> ();
    Quand un peer se connecte (le peer envoie un message avec l'id du tableau dans lequel il vient de se connecter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sessionTableau.put(client.getId(), idTableau);
    J'ai pas encore fait ça quand un peer se déconnecte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sessionTableau.remove(client.getId());
    Bon du coup dans la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Session peer : client.getOpenSessions()) {
    Je vérifie si le tableau de peer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sessionTableau.get(peer.getId())
    Et le même que le tableau de client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sessionTableau.get(client.getId())
    Si ce n'est pas le même je n'envoie pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(sessionTableau.get(client.getId()) == sessionTableau.get(peer.getId())){
    	peer.getBasicRemote().sendObject(message);
    }
    else{
    	System.out.println("Là j'envoie pas");
    }
    Apparemment ça fonctionne.

    Edit :
    Lors de la déconnexion d'un client on gère ça côté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @OnClose
    public void myOnClose (Session session, CloseReason reason) {
    	sessionTableau.remove(session.getId());
    }
    Keith Flint 1969 - 2019

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

Discussions similaires

  1. [XL-2003] Comment ne pas renvoyer le message d'erreur #N/A
    Par mandela9857 dans le forum Conception
    Réponses: 5
    Dernier message: 04/05/2013, 00h45
  2. [XL-2007] Comment ne pas afficher un message d'erreur ?
    Par j.lebowski dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/08/2010, 11h56
  3. net send n'arrive pas à envoyer de message
    Par andrianiaina dans le forum Windows XP
    Réponses: 2
    Dernier message: 27/07/2010, 00h24
  4. Réponses: 0
    Dernier message: 29/09/2009, 13h40
  5. Emetteurs n'ayant pas envoyé de message depuis plus d'1 an
    Par emccbo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/08/2007, 14h36

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