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

IO Java Discussion :

listener de socket


Sujet :

IO Java

  1. #1
    Membre habitué
    listener de socket
    J'ai une application client-serveur, multi clients avec des threads, chaque client qui se connecte je l'ajoute à une liste, mais j'ai besoin de le supprimer une fois il se déconnecte, je n'arrive pas à implémenter un listener qui détecte le statut du client.

    Code du 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
     
    List<Participant> participants = new ArrayList<>();
    try {
                    srv = new ServerSocket(Integer.valueOf(txtPort.getText()));
                    while (true) {
     
     
                        //serveur accepte la connexion d'un participant
                        Participant Ui = new Participant(nonce, srv.accept(), "Connecté...");
     
     
                        //ajouter le participant venu à la liste et rafraichir le tableau
                        participants.add(Ui);
     
     
                        //lancement du thread du nouveau participant 
                        Thread thread = new Thread(Ui);
                        thread.start();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }


    Un autre soucis, si on veux identifier un client, suggérez vous l'adresse ip comme identifiant ou existe on utiliser autre information ?

    Merci

  2. #2
    Membre confirmé
    Bonjour,

    Une façon simple serait d’entourer ta méthode Participant.run() d'un try-finally qui enlève ce participant de la liste. Il faut donc passer la liste dans le constructeur et ensuite faire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Override
    public void run() {
      try {
       // ...
      } finally {
        participants.remove(this);
      }
    }


    Si tu fais cela, un ArrayList n'est pas thread-safe alors utilise un block synchronize ou utilise une autre implémentation multi-thread.

    si on veux identifier un client, suggérez vous l'adresse ip comme identifiant ou existe on utiliser autre information ?
    une même adresse ip peut être utilisée par plusieurs clients. Ce serait plutôt une combinaison de remoteIp + remotePort . Une autre option serait de juste utiliser localPort (chaque nouvelle connection au port que tu bind change de port pour un port local unique. C'est comme ça que le kernel sait ou envoyer les messages).