Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174

    StreamCorruptedException

    Ciao a tutti. sto realizzando un tracker per un protocollo di file sharing inspirato a BitTorrent. Per gestire lo swarm uso due thread

    - un thread per la gestione dello swarm
    - un thread per il controllo della presenza dei peer

    Ho una classe chiamata TCPTracker nella quale uso una socket ssl in ascolto per tutti i peer che si collegano al tracker, questi ultimi si identificano mediante il riferimento al descrittore del file che intendono condividere (che è anche l'identificatore dello swarm) e dopodichè vengono assegnati ad un apposito servizio che gestisce le loro richieste (TCPTrackerService che implementa l'interfaccia Runnable). Al costruttore del servizio passo il riferimento allo socket e da questa cerco di riottenere gli input e gli output stream ottenendo un StreamCorruptedException.

    Parte della classe TCPTracker


    while (true) {
    try {
    if (active) {
    socket = server.accept();

    ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

    [...]

    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());

    [...]
    if (found) {
    out.writeUTF("Welcome OK");
    out.flush();
    out.close();
    trackMan.getSwarms().get(index).addPeer(peer);
    ----------------------> TCPTrackerService tmp = new TCPTrackerService(socket, trackMan.getSwarms().get(index));
    tcpTrackConnServices.execute(tmp);
    } else {
    out.writeUTF("Bad ERROR");
    out.flush();
    }
    }

    [...]

    } catch (IOException ex) {
    ex.printStackTrace();
    } catch (ClassNotFoundException ignore) {
    }
    }



    Costruttore della classe TCPTrackerService


    public TCPTrackerService(Socket socket, Swarm swarmRef) throws IOException {
    this.socket = socket;
    this.inStream = new ObjectInputStream(socket.getInputStream()); <-----------------
    this.outStream = new ObjectOutputStream(socket.getOutputStream());
    this.swarmRef = swarmRef;
    active = true;
    }


    La freccia indica il punto dove ottengo l'eccezione. Mi sapreste dire il perchè? Grazie infinite.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non sono stato lì a guardare con attenzione tutto il codice e a fare dei test, però credo che il problema sia dovuto al fatto che cerchi di aprire 2 (o più) ObjectInput/OutputStream sulla stessa socket.

    Prova, più semplicemente, a passare al costruttore di TCPTrackerService il riferimento agli oggetti ObjectInputStream e ObjectOutputStream già creati in precedenza e non il riferimento alla socket.


    PS: per il codice, senza star lì a formattare ogni volta il carattere, usa semplicemente gli appositi tag
    [code]
    codice
    [/code]

    Si arrangia il forum a fare il resto.


    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Ok, provo subito e ti faccio sapere; grazie mille per il consiglio, sono nuovo e ancora non so i tag da usare

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Perfetto ti ringrazio infinitamente mi hai risparmiato una nottata A presto ciao ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Scusate tanto ho un altro problema! Premetto che sto facendo dei test e se vanno già male sn messo bene . Allora in pratica ogni descrittore ha associato un istanza della classe Swarm che contiene un Vector<PeerData> nel quale memorizzo i dati di tutti i peer connessi allo swarm.

    Ogni peer a intervalli di tempo si scarica questa lista mediante la socket TCP di cui sopra e ho provato a lanciare due fake peer e mi succede la seguente cosa:

    avvio il primo peer (1): tutto ok si scarica la lista, gliela faccio stampare e risulta essere connesso lui e chi ha pubblicato il descrittore

    avvio il secondo peer (2): tutto ok si scarica la lista, gliela faccio stampare e risulta essere connesso lui, il peer 1 e il peer che ha pubblicato il descrittore.

    Il problema sta nel fatto che, nel frattempo che il peer 2 si è collegato il peer 1 continuava a scaricare la lista e, mentre nella lista del peer 2 compare il peer 1, il peer 2 nella lista del peer 1 non compare: come se la lista inviata dal server fosse sempre la stessa non aggiornata, eppure la lista viene aggiornata ad ogni connessione/disconnessione :berto: .

    Ecco i frammenti di codice

    TCPTrackerService

    codice:
    public void run() {
        while (active) {
           try {
                String command = inStream.readUTF();
                if (command.equals("List")) {
                    BCServerGui.addEvent("Peer " + socket.getInetAddress() + " require peer's list\n");
                    System.out.println("Size = " + swarmRef.getPeersList().size());
                    outStream.writeObject(swarmRef.getPeersList());
                    outStream.flush();
                }
                if (command.equals("Close")) {
                    BCServerGui.addEvent("Peer " + socket.getInetAddress() + " go away\n");
                    swarmRef.removePeer(new PeerData(socket.getInetAddress(), socket.getPort()));
                        
                    outStream.writeUTF("Bye");
                    outStream.flush();
    
                    inStream.close();
                    outStream.close();
                    socket.close();
                    active = false;
                 }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    Tester

    codice:
    for (int i = 0; i < 10; i++) {
        out.writeUTF("List");
        out.flush();
    
        Vector<PeerData> tmp = (Vector<PeerData>) in.readObject();
        for (int j = 0; j < tmp.size(); j++)
        System.out.println(j + ")" + tmp.get(j).getAddress());
        Thread.sleep(4000);
    }
    
    out.writeUTF("Close");
    out.flush();
    System.out.println(in.readUTF());
    Vi prego aiutatemi

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.