Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Dubbio su piccola chat

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356

    Dubbio su piccola chat

    Ciao a tutti,
    ho realizzato una piccola applicazione client server per un gioco.
    L'applicazione funziona perfettamente e client e server comunicano secondo un protocollo ben definito attraverso la porta 7777 TCP del server.

    Adesso vorrei inserire una piccolissima chat, per permettere ai giocatori di comunicare tra loro durante le partite.

    Naturalmente devo usare una porta diversa, giusto? in modo da non andare ad influire sul protocollo di comunicazione.

    Apro quindi un'altra porta, diciamo la 7778, questa volta in UDP e faccio avvenire la comunicazione della chat tramite questa porta.

    Solo che in questo modo l'unica comunicazione che mi riesce di fare è quella che client e server comunicano uno alla volta, uno dopo l'altro.

    Naturalmente questa soluzione non mi piace, vorrei infatti che se il server (ad esempio) volesse mandare 3 messaggi consecutivi possa farlo senza problemi.

    A questo punto mi sono posto il seguente intterrogativo:
    come faccio? Apro un altro socket, quindi due socket UDP (gestendoli in due thread diversi) e uno lo utilizzo per la comunicazione dei messaggi sal server al client e uno per i messaggi dal client al server?
    O ci sono altre soluzioni?

    Aspetto consigli
    grazie a tutti!

    EDIT: dopo aver postato questo messaggio mi è capitata sotto mano questa discussione dove si parla proprio del mio problema.

    Leggendo la risposta ho quindi capito più o meno come fare...
    Solo che in quella discussione si parla di un server in comunicazione con diversi client, mentre nel mio caso il server è in comunicazione sempre e solo con un solo client!

    Quindi in questo caso posso fare a meno della pila di cui si parla nella discussion?

    In ogni caso, avete qualche link da passare ?

    grazie a tutti di nuovo!
    Jekkil

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    ecco ciò che ho creato finora:

    classe server.java

    codice:
    package chat;
    
    /**
    
     */
    import java.net.*;
    import java.io.*;
    
    public class Server implements Runnable {
    
        private ServerSocket server;
        private Socket connessione;
        private BufferedReader dalClient;
        private PrintStream alClient;
        
    
        public Server() {
            
            try {
                server = new ServerSocket(5000, 5);
                System.out.println("Server attivo");
                connessione = server.accept();
                dalClient = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
                alClient = new PrintStream(connessione.getOutputStream());
            } catch (Exception e) {
                e.printStackTrace();
    
            }
        } // Server()
    
        public void conversazione() {
            System.out.print("Thread per l'invio avviato\n");
            Thread t = new Thread(this);
            t.start();
            String messaggio = "";
            BufferedReader t1 = new BufferedReader(new InputStreamReader(System.in));
            try {
    
                while (true) {
                    messaggio = t1.readLine();
    
    
                    alClient.println(messaggio);
    
                } // while
            } catch (IOException e) {
                System.out.println("Conversazione interrotta");
            }
        } // conversazione()
    
        public void run() {
            System.out.print("Thread per la ricezione avviato\n");
            String messaggio;
            boolean c = true;
            while (true) {
                try {
                    messaggio = dalClient.readLine();
                    System.out.print(messaggio);
                } catch (IOException ex) {
                    c = false;
                }
            }
        }
    }
    classe client.java
    codice:
    package chat;
    
    /**
    
     */
    import java.net.*;
    import java.io.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class Client implements Runnable {
    
        private Socket connessione;
        private BufferedReader dalServer;
        private PrintStream alServer;
    
        public Client() {
    
            BufferedReader t = new BufferedReader(new InputStreamReader(System.in));
            try {
                System.out.println("Inserire indirizzo server: ");
                String indirizzo = "127.0.0.1";
                connessione = new Socket(indirizzo, 5000);
                dalServer = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
                alServer = new PrintStream(connessione.getOutputStream());
            } catch (IOException e) {
                System.out.println(e);
            }
        } // Client()
    
        public void conversazione() {
            Thread t = new Thread(this);
            t.start();
            System.out.print("Thread per l'invio avviato\n");
            String messaggio = "";
            BufferedReader t1 = new BufferedReader(new InputStreamReader(System.in));
            try {
                int i = 0;
                while (i < 5) {
                    messaggio = t1.readLine();
    
                    alServer.println(messaggio);
                    i++;
    
                } // while
                t.interrupt();
                connessione.close();
            } catch (IOException e) {
                System.out.println("Conversazione interrotta");
            }
        } // conversazione()
    
        public void run() {
            System.out.print("Thread per la ricezione avviato\n");
            String messaggio;
            while (!Thread.interrupted()) {
                try {
                    messaggio = dalServer.readLine();
                    System.out.print(messaggio);
                } catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
    A parte il fatto che non ho ancora realizzato un controllo come si deve per far terminare la conversazione, che in realtà poi non dovrà terminare mai, se non quando si chiude l'applicazione, mentre in questo caso viene brutalmente fatta finire dopo che il client manda 5 mess, il fatto è che mi sembra che dopo un po' che sta in esecuzione il tutto si rallenti...
    ma non capisco se dipende da qualcosa scritto male...

    Secondo voi com'è?
    Jekkil

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.