Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512

    [JAVA] inviare stringa da un thread all'altro

    ciao

    ho un server che accetta + client
    ad ogni client che si connette, creo un thread.

    ora, vorrei poter inviare una stringa da un client all'altro (immagino passando dal server).

    Ovviamente pero' per fare questo devo distinguere i thread e poi volevo sapere se esiste un qualche metodo per poter inviare questa stringa

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Di recente è stato aperto un forum dedicato al linguaggio Java. Ti sposto lì.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Beh ad ogni thread quando lo crei puoi assegnare un nome che lo distingue altrimenti gliene viene assegnato uno di base... :master:
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il metodo più semplice è attribuire un id ad ogni thread. Tale id dovrebbe essere la posizione del thread all'interno di un Vector (o array, se prevedi un numero limitato di Clients) che contiene tutti i Thread.

    In questo modo, quando un client (thread) invia un messaggio, al suo interno dovrebbe inviare anche il proprio ID.

    Dato che molto probabilmente vuoi implementare una piccola chat, il suggerimento che ti dò è quello di utilizzare appunto un Vector per memorizzare tutti i Thread. Quanto un client chiede l'invio del messaggio ad un altro client, deve ovviamente specificare il destinatario (a meno che non si tratti di un messaggio pubblico). A questo punto scorri tutto il vector alla ricerca del destinatario (tramite un metodo che ritorna il nome utente scelto) e invii a costui il messaggio.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512
    allora..
    spiego un po com'è la nostra applicazione:
    ogni nuovo client che si connette, il server apre un nuovo thread a lui associato che ne gestisce la comunicazione. Il nome del nuovo thread che il server lancia automaticamente è uguale allo userID del client, quindi: thread.setName(userID).
    Ora.. il problema è che questi thread vengono creati a tempo di esecuzione, quindi quando scrivo il codice non conosco il nome del thread che sarà creato, proprio perchè questo nome è variabile a seconda del client o dei client che si connetteranno.
    Ogni client ha a disposizione un comando del tipo: >message [user] [messaggio].

    Se io sono il client autenticato come pippo, nel server c'è un thread "pippo" che riceve il mio comando. Mettiamo che oltre a me ci sia un altro client, di nome tizio, quindi nel server è attivo un'altro thread di nome "tizio". Se pippo vuole mandare un messaggio a tizio scriverà >message [tizio] [ciao]; quindi: il thread pippo riceve il comando, e a questo punto deve dire al thread "tizio" di scrivere attraverso il *suo* stream il messaggio, che quindi arriverà solo a tizio.

    Come faccio a dire a pippo di usare un metodo (che sarà quindi send()) del thread tizio in esecuzione?

    ribadisco che questi thread sono aperti dal server in modo autonomo, variabile e dipendente dal numero di client connessi

    grazie mille in anticipo

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Semplice: nel server metti a disposizione un metodo ( send() ), che verrà utilizzato da qualsiasi thread per inviare un messaggio. Sarà il server che andrà a pescare il thread del destinatario giusto e gli dirà di inviare la stringa. Pressappoco in questo modo:

    codice:
    class Server extende Thread {
    
       private class ServerThread extends Thread {
          private ObjectOutputStream canaleOut;
          private ObjectInputStream canaleIn;
          private String id;
          ...
    
          public void run() {
             msg = (Messaggio) canaleIn.readObject();
             send( msg );
          }
    
          public void inviaMessaggio(Messaggio msg) {
             canaleOut.writeObject(msg);
             canaleOut.flush();
          }
    
          public String getID() { return id; }
       }
    
       ...
    
       public void send(Messaggio msg) {
          // Per chi è il messaggio?
          String destinatario = msg.getDestinatario();
    
          // cerco il destinatario
          for (int i=0; i<mieiCliens.size(); i++) {
             if ( ((ServerThread) mieiClients.elementAt(i)).getID().equals( destinatario ) ) {
                // Ho trovato il destinatario... gli invio il messaggio
                ((ServerThread) mieiClients.elementAt(i)).inviaMessaggio( msg );
             }
          }
       }
    
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di pip19
    Registrato dal
    Dec 2001
    Messaggi
    512
    come faccio a memorizzare i vari thread dentro ad un vector (o array)?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Così:
    codice:
    class Server extends Thread {
    
       private class ServerThread extends Thread {
          ...
          public ServerThread(Socket s) {
             ...
          }
       }
    
       private Vector mieiClients;
    
       public Server() {
          ...
          mieiClients = new Vector();
          ...
       }
    
       public void run() {
          ...
          Socket s = serverSocket.accept();
          mieiClients.add( new ServerThread(s) );
          ((ServerThread) mieiClients.elementAt(mieiClients.size()-1)).start();
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.