Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    [Java] ObjectInputStream bacato?

    Adesso Java comincia a farmi arrabbiare... è forse bacata la classe ObjectInputStream? Non è possibile che del codice identico funzioni 3 volte sì e una no...
    codice:
    import java.io.*;
    import java.net.*;
    import java.util.Vector;
    
    public class Server extends Thread {
    
       private class GestioneClient extends Thread {
          private ObjectInputStream ois = null;
          private ObjectOutputStream oos = null;
          private Messaggio msg;
          private int id;
    
          public GestioneClient(InputStream is, OutputStream os, int id) throws Exception {
             this.id = id;
             ois = new ObjectInputStream(is);
             oos = new ObjectOutputStream(os);
             System.out.println("Costruttore");
          }
    
          public void run() {
             try {
                while (true) {
                   msg = (Messaggio) ois.readObject();
                   processaMessaggio(msg);
                }
             } catch (Exception e) { e.printStackTrace(); }
          }
    
          public void inviaMessaggio(Messaggio msg) throws Exception {
             oos.writeObject(msg);
             oos.flush();
          }
    
          private void processaMessaggio(Messaggio msg) {
             Vector v = msg.getMessaggio();
             for (int i=0; i<v.size(); i++) System.out.println( v.elementAt(i) );
          }
       }
    
       private ServerSocket server;
       private InputStream is;
       private OutputStream os;
       private Vector clients;
       private Vector connessioni;
       private boolean attivo;
       private int id;
    
       public Server() {
          clients = new Vector();
          connessioni = new Vector();
          attivo = true;
       }
    
       public void run() {
          try {
             server = new ServerSocket(2525);
             while (attivo) {
                Socket c = server.accept();
                System.out.println("Arrivata connessione numero " + clients.size() + 1);
                is = c.getInputStream();
                os = c.getOutputStream();
                id = clients.size();
                clients.add( new GestioneClient(is, os, id) );
                System.out.println("PASSO SUCCESSIVO");
                ((GestioneClient) clients.elementAt(clients.size()-1)).start();
                connessioni.add( new String("Connessione " + (connessioni.size() + 1) + "!") );
                Messaggio msg = new Messaggio( (Vector) connessioni.clone() );
                inviaNuovoVettore(msg);
             }
          } catch (Exception e) { e.printStackTrace(); }
       }
    
       private void inviaNuovoVettore(Messaggio m) {
          try {
             for (int i=0; i<clients.size(); i++) {
                ((GestioneClient) clients.elementAt(i)).inviaMessaggio(m);
             }
          } catch (Exception e) { e.printStackTrace(); }
       }
    
       public static void main(String [] args) {
          Server s = new Server();
          s.start();
       }
    }
    Se tolgo le linee in grassetto tutto funziona perfettamente, se le lascio non compare mai la scritta "PASSO SUCCESSIVO"...
    Qualcuno ha una vaga idea del perchè?

    N.B.: Ho scritto una chat con del codice praticamente identico... la chat funziona perfettamente!!!

    P.S.: Tralasciate il fatto che il messaggio sia costituito da un Vector... mi serviva solo per fare dei test.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Ma ti da qualche errore nel try/catch??
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non dà nessun errore, né in compilazione, né in esecuzione... semplicemente si blocca nella costruzione dell'oggetto ObjectInputStream.


    E' questo che mi stupisce: se ci fossero degli errori potrei provare a risolverli, ma non ce ne sono... lo stesso codice (identico!!) messo in un'altra applicazione funziona alla perfezione...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    In pratica resta bloccato sulla creazione dell'ObjectInputStream , ma sinceramente non mi viene il perchè....
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  5. #5
    L'ho modificato così e mi funziona
    Ciauz

    codice:
    public GestioneClient(InputStream is, OutputStream os, int id) throws Exception {
          this.id = id;
          this.is=is;
          this.os=os;
    //      ois = new ObjectInputStream(is);
    //    oos = new ObjectOutputStream(os);
          System.out.println("Costruttore");
        }
    
    public void run() {
          try {
    ois = new ObjectInputStream(is);
            while ( true ) {
              msg = (Messaggio)ois.readObject();
              processaMessaggio(msg);
            }
          }
          catch (Exception e) {
            e.printStackTrace();
          }
        }
    
        public void inviaMessaggio(Messaggio msg) throws Exception {
    if(oos==null)oos = new ObjectOutputStream(os);
    oos.writeObject(msg);
          oos.flush();
        }
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  6. #6
    Utente di HTML.it L'avatar di Zalex
    Registrato dal
    Aug 2001
    Messaggi
    357
    per l'ObjectInputStream devi fare una new quando ti serve; se lo fai una volta per tutte non funziona; quindi dichiari l'ObjectInputStream e fai una new quando devi usare quello stream.
    Ci ho sbattuto la testa anche io l'anno scorso per un progetto

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Per Zero-2: grazie... l'ho scritto pure io!!!

    Per Zalex... non ho ben capito cosa tu intenda , ma non posso ricostruirmi l'ObjectInputStream ogni volta: lo costruisco una volta e, ad ogni ciclo di while, rimango in attesa (su quell'ObjectInputStream) di un messaggio in arrivo dal Server (o dal client nel caso opposto)...

    Il problema è che l'ObjectInputStream non lo crea.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.