Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305

    Nel server java.io.StreamCorruptedException: invalid type code: AC

    Si verifica l'eccezione del titolo alla riga indicata nel commento del codice
    codice:
    
    
    codice:
    package jcallremember.server;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import jcallremember.libreria.Credenziali;
    import jcallremember.libreria.Operazioni;
    import jcallremember.libreria.ClienteDB;
    /**
     *
     * @author Pasquale Caloriger
     * Questa Classe implementa un thread Server che fornisce servizi al client
     */
    public class ServerWorker implements Runnable{
        private final Socket socket;
        private final Thread worker;
        private  Credenziali login;
        private final InputStream is;
        private final OutputStream os;
        public ServerWorker(Socket socket) throws IOException{
            this.socket=socket;
            this.worker=new Thread(this);
            this.is=this.socket.getInputStream();
            this.os=this.socket.getOutputStream();
        }
        public void start(){
            this.worker.start();
        }
        @Override
        public void run() {
            //Nella prima fase il thread worker legge i dati di login che il client 
            //invia
            if (socket.isConnected()) {
                try {
                    ObjectInputStream ois = new ObjectInputStream(is);
                    //legge l'oggetto Credenziali inviato dal client
                    this.login=(Credenziali)ois.readObject();
                    ObjectOutputStream oos=new ObjectOutputStream(this.os);
                    //invia al client true se il login è corretto , false
                    //altrimenti
                    oos.writeBoolean(Database.getInstance().isLoginCorrect(login));
                    oos.flush();
                    //si mette in attesa di richieste da parte del client
                    while(true){
                        //aspetto di leggere un oggetto Operazioni(enum)
                        Operazioni op=(Operazioni)ois.readObject(); //si verifica l'eccezione
                        switch(op){
                            case INSERIMENTO:
                                ClienteDB cliente=(ClienteDB)ois.readObject();
                                Boolean isOk=Database.getInstance().insertCliente(cliente,
                                        login.getUsername());
                                oos.writeBoolean(isOk);
                                oos.flush();                            
                                break;
                            case DOWNLOAD:
                                Object [][]  appuntamenti=Database.getInstance().
                                        downloadAppuntamentiOperatore(this.login);
                                oos.writeObject(appuntamenti);
                                oos.flush();
                                break;
                                
                            
                        }
                    }
                       
                        
                    
                } catch (IOException | ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(ServerWorker.class.getName()).
                            log(Level.SEVERE, null, ex);
                }
                
            }
        }
        
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Si verifica l'eccezione del titolo alla riga indicata nel commento del codice
    Nel client crei più volte un nuovo ObjectOutputStream per comunicare sullo stesso output stream del socket? Se sì, il problema è lì.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    si.. in metodi diversi

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ma è possibile inviare un enum su un socket?? perchè quando lo invio col metodo wirtieObject il server mi da questa eccezione:
    Exception in thread "Thread-4" java.lang.ClassCastException: java.lang.String cannot be cast to jcallremember.libreria.Operazioni
    Dove Operazioni è una enum.
    Server:
    Operazioni op = (Operazioni) ois.readObject();

    Client
    Operazioni obj=Operazioni.DOWNLOAD;
    oos.writeObject(obj);
    oos.flush();

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    si.. in metodi diversi
    La serializzazione degli oggetti utilizza un "protocollo" ben preciso, che prevede un piccolo header di 4 byte iniziali per "marcare" lo stream per la serializzazione.
    In sostanza è sbagliato "appendere" oggetti sullo stesso stream con un nuovo ObjectOutputStream.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    ma è possibile inviare un enum su un socket??
    Le enum sono serializzabili ma il trattamento è più particolare. Con altre classi, quando deserializzi ottieni un nuovo oggetto. Con le enum no, perché il concetto è quello di avere un numero fisso e preciso di istanze, che sono poi le costanti della enum.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    perchè quando lo invio col metodo wirtieObject il server mi da questa eccezione:
    Exception in thread "Thread-4" java.lang.ClassCastException: java.lang.String cannot be cast to jcallremember.libreria.Operazioni

    Server:
    Operazioni op = (Operazioni) ois.readObject();

    Client
    Operazioni obj=Operazioni.DOWNLOAD;
    oos.writeObject(obj);
    oos.flush();
    Non è che stai aspettando il dato al momento sbagliato?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Allora praticaamente avrei bisogno di creare due oggetti objectinputstream e quindi due objectoutputstream sugli stessi inputstream e outputstream! è fattibile sta cosa?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Allora praticaamente avrei bisogno di creare due oggetti objectinputstream e quindi due objectoutputstream sugli stessi inputstream e outputstream! è fattibile sta cosa?
    Uno stesso oggetto InputStream vuoi incapsularlo in due distinti ObjectInputStream?? E per quale motivo?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Nessun motivo particolare. Mi chiedevo se era una cosa fattibile tutto qui!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Nessun motivo particolare. Mi chiedevo se era una cosa fattibile tutto qui!
    In generale è bene evitare che lo stesso oggetto di I/O sia usato da più wrapper. Poi per ObjectInputStream sicuramente è da evitare. Il costruttore di ObjectInputStream la prima cosa che fa è leggere l'header della serializzazione (che è una sequenza ben precisa di pochi byte). Se 2 ObjectInputStream cercano di leggerlo dallo stesso stream ...... beh, immagina tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ma in modo sincronizzato la cosa sarebbe fattibile?

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.