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

    Problema CastException con chat java

    Ciao a tutti sono nuovo del forum e spero che qualcuno mi possa aiutare perchè sto rendendo complicatissima una cosa che dovrebbe essere fatta con una certa faciltà, cioè unasemplice chat in java con client e server multithread;
    Premetto che ho già dato un'occhiata alle varie versioni trovate su questo sito e sul forum, ma vorrei evitare di copiarle, perchè dato che all'esame devo anche spiegare come l' ho fatta vorrei cercare di capire quello che scrivo, quindi spero in qualcuno che mi spieghi i vari passi se non riesco a farli da me; per il momento posto un errore di cui non riesco a capire la causa, forse perchè non ho ancora molta familiarità con il linguaggio java:

    codice:
     
    ----------SERVER-------------
    
    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    public class ChatServer {
    
        private static final int serverPort = 7890;
        public static Vector n_utenti = new Vector();
        public int n;
        public Connessione s;
    
        public ChatServer() {
        }
    
        public static void main(String args[]) {
    
            try {
    
                ServerSocket server = new ServerSocket(serverPort);
                System.out.println("Server Attivo");
                while (true) {
                    Socket clientSocket = server.accept();
    
                   Connessione c = new Connessione(clientSocket /*, u*/);
    
                   n_utenti.add(c);
    
                   System.out.println(n_utenti.size());
                }
    
            } catch (IOException e) {
                System.out.println("Listen:" + e.getMessage());
            }
      }
    }
    
    class Connessione extends Thread {
    
        BufferedReader in;
        PrintWriter out;
        Socket clientSocket;
    
        DataOutputStream o;
    
        boolean connesso = true;
    
       public Connessione(Socket aClientSocket /*, Utente u*/) {
    
            try {
    
                this.clientSocket = aClientSocket;
    
                System.out.println("connessione ricevuta da: " +
                                   clientSocket.getInetAddress());
                in = new BufferedReader(new InputStreamReader(clientSocket.
                        getInputStream()));
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                this.start();
    
            } catch (IOException e) {
                System.out.println("Connessione:" + e.getMessage());
            }
        }
    
        public void run() {
    
            Socket address;
    
            try { // an echo server
                // echo client input
                out.println("Hello! Enter BYE to Exit");
    
                boolean done = false;
                while (!done) {
                    String line = in.readLine();
                    if (line == null) {
                        done = true; //Loop infinito in cui scrivo qualcosa e me lo rispedisco, finch� nn scrivo "Bye"
                    }
    
                    else if (line.trim().equals("BYE")) {
                        done = true;
                    }
    
                    else {
                        for (int i = 0; i < ChatServer.n_utenti.size(); ) {
                            try {
                                address = (Socket) (ChatServer.n_utenti.get(i));
                                o = new DataOutputStream(new BufferedOutputStream(address.getOutputStream()));
                                o.writeUTF(line);
                                o.flush();
    
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println(ChatServer.n_utenti.size());
                        out.println(line);
                    }
                }
    
                System.out.println("il Client " + clientSocket.getInetAddress() +
                                   " si � disconnesso");
    
            } catch (EOFException e) {
                System.out.println("EOF:" + e.getMessage());
            } catch (IOException e) {
                System.out.println("IO:" + e.getMessage());
            } finally {
                try {
                    clientSocket.close();
                } catch (IOException e) {}
            }
        }
    }
    
    ---------CLIENT-----------
    
    import java.net.*;
    import java.io.*;
    
    
    public class ChatClient {
    
    
        /** Creates a new instance of EchoClient */
        public ChatClient() {
        }
    
        public static void main(String args[]) {
            // arguments supply message and hostname of destination
    
            Socket s = null;
    
            try {
                String SERVER = "localHost";
                int serverPort = 7890;
    
                s = new Socket(); //si crea una socket NN bloccante
                s.connect(new InetSocketAddress(SERVER, serverPort), 1000); //Dopo 1000 ms esce, altrimenti nresterebbe bloccato
    
                BufferedReader s_in = new BufferedReader (new InputStreamReader(s.getInputStream())); //verso server
                PrintWriter s_out = new PrintWriter(s.getOutputStream(),true);
    
                BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
    
                String data = s_in.readLine();
                System.out.println(data);
    
                while (true) {
                    String input = console.readLine();
    
                    s_out.println("Echo: " +input);
                    data = s_in.readLine();
    
                    System.out.println(data);
    
                    if (input.trim().equals("BYE")) {
                        System.exit(0);
    
                } }
    
            } catch (UnknownHostException e) {
                System.out.println("Sock:" + e.getMessage());
            } catch (EOFException e) {
                System.out.println("EOF:" + e.getMessage());
            } catch (IOException e) {
                System.out.println("IO:" + e.getMessage());
            }
    
            finally {
                if (s != null) {
                    try {
                        s.close();
                    } catch (IOException e) { //Entra in gioco quando il socket viene chiuso per motivi esterni all'utente
                        System.out.println("close:" + e.getMessage());
                    }
                }
            }
        }
    
        private void jbInit() throws Exception {
        }
    }
    Faccio paritre il server e il client e tutto ok, però quando sul client provo a scrivere qualcosa e premo invio, non succede niente (nel senso che non me lo scrive su tutti i client connessi) e sul server esce a ciclo infinito questo errore:

    at progetto.Connessione.run(Connessione.java:59)
    java.lang.ClassCastException
    at progetto.Connessione.run(Connessione.java:59)
    java.lang.ClassCastException
    at progetto.Connessione.run(Connessione.java:59)...

    In particolare si rferisce a questa parte di codice:
    codice:
    for (int i = 0; i < ChatServer.n_utenti.size(); ) {
                            try {
                                address = (Socket) (ChatServer.n_utenti.get(i));
                                o = new DataOutputStream(new BufferedOutputStream(address.getOutputStream()));
                                o.writeUTF(line);
                                o.flush();
    Io vorrei fare in modo che qualsisasi cosa scrivo su un client venga trasmesso anche agli altri, se qualcuno può indicarmi un modo oltre a questo...grazie a tutti ciao ciao

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    address = (Socket) (ChatServer.n_utenti.get(i));
    mi sembra che in n_utenti tu metti degli oggetti Connessione
    il cast è sbagliato

  3. #3
    Scusa ma quindi come casto?oppure, altre alternative nel mio codice per fare il broadcast dei messaggi? grazie

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    codice:
    address = (Connessione)(ChatServer.n_utenti.get(i)).clientSocket;
    dovrebbe essere giusto

  5. #5
    Ciao allora il cast così è giusto, nel senso che non mi lancia ccezioni, però non funziona correttamente..o almeno, su jbuilder non me lo scrive su tutte le finestre dei client aperte, ma se vado su console e faccio con telnet funziona...è normale?
    Seconda cosa: appurato che con telnet funziona, però ogni volta che scrivo qualcosa su un client e premo invio, negli altri client appare solo una volta e va bene, ma su quello che scrivo la frase o la parola, dopo aver premuto invio mi appare a capo la stessa scritta due volte e una di seguito all'altra senza spazio..inoltre negli altri client appare una sola volta come deve essere ma senza andare a capo, ma tutti sulla stessa riga...grazie mille

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.