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

    Problema con serializzazione nei socket

    Buongiorno, vi scrivo perché è da parecchio tempo che mi trovo di fronte ad un problema con la serializzazione di un oggetto tramite ObjectOutputStream e non riesco proprio a venirne a capo.

    Mi spiego, ho creato un piccolissimo scambio di oggetti tra un server e un client. In particolare, il server manda un oggetto avente un attributo intero al client, che deve leggere questo attributo.

    Ora, all'inizio va tutto bene: il server setta l'attributo dell'oggetto a 0, invia al client l'oggetto che ne legge l'attributo ed è effettivamente zero.

    Nasce, adesso, il problema: il server modifica l'attributo, settandolo ad un valore diverso da 0 (2), invia nuovamente e secondo le stesse procedure l'oggetto al client: questi, una volta ricevuto l'oggetto ne legge l'attributo MA non legge il valore modificato (2), bensì il valore iniziale (0).

    Ora, facendo diverse prove ho notato che se il client salva il secondo oggetto su una nuova variabile, anziché 'sovrascrivere' la stessa, riesce nella lettura dello stato modificato. Tuttavia per l'applicazione che sto pensando questo è infattibile, dal momento che il client dovrebbe ricevere le modifiche a quell'oggetto innumerevoli volte e salvare ogni volta l'oggetto su una nuova variabile diventa impensabile.

    Vi invio il codice di cui sto parlando.

    LATO SERVER

    codice:
    private void start() throws IOException {		ServerSocket serv= new ServerSocket(4567);
    		Socket client = serv.accept();
    		ObjectOutputStream output = new ObjectOutputStream(client.getOutputStream());
    		ObjectInputStream input = new ObjectInputStream(client.getInputStream());
    		Stato stato = new Stato();
    		output.writeObject(stato);
    		System.out.println(stato.getStato());
    		stato.setStato(2);
    		System.out.println(stato.getStato());
    		output.writeObject(stato);
    	}
    LATO CLIENT
    codice:
        private void start() throws IOException, ClassNotFoundException {
            Socket client=null;;
            try {
                client = new Socket("127.0.0.1", 4567);
            } catch (Exception e) {
                System.out.println("Connessione rifiutata.");
                e.printStackTrace();
                return;
            } 
            System.out.println("CAC");
            ObjectOutputStream output = new ObjectOutputStream(client.getOutputStream());
            ObjectInputStream input = new ObjectInputStream(client.getInputStream());
            Stato s = (Stato) input.readObject();
            System.out.println(s.getStato());
            s = (Stato) input.readObject();
            System.out.println(s.getStato());
        }

    Quale può essere il problema? La serializzazione passa una copia per valore dell'oggetto, giusto? Cioè, non passa un riferimento quindi ovviamente non mi posso aspettare che il client riceva le modifiche effettuate dal server senza che l'oggetto venga nuovamente inviato. Tuttavia, sembra come se il client non voglia ricevere nuovamente lo stesso tipo di oggetto: come mai?
    Ho anche pensato ad una soluzione in cui il client osservi l'oggetto tramite le funzionalità del pattern Observer, però forse neanche questo è fattibile, dal momento che il client osserverebbe una copia per valore dell'oggetto e non l'oggetto stesso?

    Sperando di trovare una soluzione, intanto vi ringrazio per l'attenzione.

  2. #2
    Ho trovato la soluzione, nel caso in cui a qualcuno potesse servire occorreva svuotare il buffer tramite un output.reset(); dopo l'invio

    Potete chiudere.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.