Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    wait() e notify() in una chat

    Non riesco a capire come inserire la sincronizzazione in una chat, potreste darmi qualche consiglio per sapere come partire per favore?

    Devo per caso inserirli nel runner? Vi posto il pezzo di codice dove si trova il metodo run:


    codice:
    class ClientConn implements Runnable  {
    
        private Socket client;
        private BufferedReader in = null;
        private PrintWriter out = null;
    
        ClientConn(Socket client) {
            this.client = client;
            try {
                in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                out = new PrintWriter(client.getOutputStream(), true);
            } catch (IOException e) {
                System.err.println(e);
                return;
            }
        }
    
        public void run() {
            String msg, response;
            ChatServerProtocol protocol = new ChatServerProtocol(this);
            try {
                while ((msg = in.readLine()) != null) {
                    response = protocol.process(msg);
                    out.println("SERVER: " + response);
                }
            } catch (IOException e) {
                System.err.println(e);
            }
        } 
    
        public void sendMsg(String msg) {
            out.println(msg);
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quale sarebbe il problema?

  3. #3
    Vorrei usare la programmazione concorrente in una chat java. Ma non so da dove partire, ho letto che bisogna utilizzare i metodi wait() e notify(), ma i documenti che ho trovato su internet non fanno riferimenti espliciti a delle chat. Ho solo capito che un thread si pone in uno stato di attesa (wait) fino a quando tramite un notify non gli viene detto di ripartire.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il discorso è abbastanza lungo per essere affrontato in questa maniera.

    Comunque ti serve una classe che fa da Server, e che tenga traccia di ogni client che si connette. La classe avvierà un Nuovo thread ogni volta che un client si connette. Il Server deve ovviamente utilizzare ServerSocket.

    Un esempio molto veloce:

    codice:
    while(server_avviato) {
      Socket s = serverSocket.accept();
      elencoClient.add(new ClientConnesso(s.getInputStream(), s.getOutputStream()));
    }
    Potresti anche passare un ID al singolo client, così da identificarlo.
    Nel codice, s rappresenta il client che si connette, e la classe ClientConnesso estenderà Thread. Questa classe si occuperà della gestione delle comunicazioni tra il Client ed il Server.
    elencoClient è un ArrayList.

    Quando un client invia una risposta, questa viene ricevuta da ClientConnesso che si occuperà della sua elaborazione.

    Qui dipende poi da come vuoi creare la tua chat. Se tipo IRC oppure che scambi messaggi privati. Nel caso di una connessione Client-Client, il Server farà da tramite.
    Esempio:

    Client: A, B

    Se A manda un messaggio a B, questo viene ricevuto prima dal Server, e poi inoltrato a B.
    Questo è ovvio, perchè se A comunica mandando un messaggio via Socket, questo viene ricevuto in ClientConnesso, qui poi dovrai inviarlo alla classe Server che si occuperà della ricerca del Client all'interno dell'ArrayList.

    Va da se, che una volta connesso via Socket, puoi inviare un nominativo per quel client, che sarà il nick con cui si logga.

    In pratica dovrai avere:
    Client --> Che al suo interno ha un oggetto Socket (oltre ovviamente ad altre info);
    Server --> Che ha un oggetto ServerSocket, e contiene l'elenco dei Client connessi.
    AltraClasse ---> che estende Thread e rappresenta il Client connesso (e classe tramite cui ricevi i messaggi del Client e invii al Client).


    Il panorama è questo. Non sono più preciso poichè come hai notato è piuttosto vasto, e sino a che non incontri un problema più mirato, non so che altro dirti. Le cose che devi sapere per iniziare sono queste (pensa a scrivere il Server).
    Se hai altre domande, siamo qui.

  5. #5



    Grazie Patrick Jane, sei stato molto gentile!

    Allora, ho già tutto il codice per una chat, l'ho dovuto sviluppare per un progettino in classe. La mia chat funziona così: il server legge il messaggio inviato da un client (in questo caso scritto da terminale) e lo invia in broadcast a tutti gli utenti connessi stampandolo su tutti i terminali (il suo compreso).

    Ora, dovrei implementare la sincronizzazione. Cioè, quando un cliente si connette deve aspettare che che il canale sia libero per poter essere aggiunto. Quindi, prima di creare il nuovo thread nella classe server per aggiungere l'utente utente questo si mette in attesa wait() fino a quando con un notify() non gli viene detto di aggiungere il cliente. Il notify viene attivato tramite un'altra classe che monitora l'arrivo dei client.

    Come posso perà attivare il notify da un'altra classe? E' questo che non riesco a capire, cosa aspettano i metodi wait() e notify() per attivarsi.

    Se non sono stata chiara sono qua per altre spiegazioni ^^

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.