Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [Java] stream in rete

  1. #1

    [Java] stream in rete

    Salve, ho un piccolo quesito da proporvi: ho creato una piccola rete domestica composta da due pc e ho fatto un programmino d test che sfrutta i socket x trasferire 1 file. Il file viene letto da un oggetto FileInputStream e scritto direttam nell'oggetto d tipo OutputStream ottenuto dal socket. È poi presente un ciclo while che fino a qnd nn viene raggiunta la fine del file scrive ogni byte letto nel flusso d output del socket. Il processo ricevente è analogo: legge dall'input del socket e scrive su file. Se i due programmi li faccio eseguire sulla stessa macchina funziona tutto bene, ma se lo faccio sulle due macchine trasferisce solo alcuni byte e poi tutto si blocca. Devo riavviare il pc server (quello che invia il file) xchè altrimenti i due pc non si vedono nemmeno più in risorse d rete. Cosa mi consigliate d fare? Devo sfruttare qualche classe di I/O particolare? Grazie, Fede
    Fede

  2. #2
    x intenderci, il codice del server è il seguente

    codice:
    ServerSocket server = new ServerSocket(1984);
    socket = server.accept();
    in = new FileInputStream("file.txt");
    out = socket.getOutputStream();
    int b = in.read();
    
    while(b != -1)
    {
       out.write(b);
       b = in.read();
    }
    out.write(-1);
    mentre quello del client

    codice:
    socket = new Socket("192.168.0.1",1984);
    out = new FileOutputStream("c:\\file.txt");
    in = socket.getInputStream();
    int b;
    while((b = in.read()) != -1) out.write(b);
    Fede

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Mi sembra strano che ti dia di questi problemi... io ho utilizzato esattamente lo stesso meccanismo per implementare il trasferimento file nella mia chat e funziona senza problemi...


    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
    ma hai esato le stess classi di I/O oppure ad esempio hai usato il datainputstream, ecc...?
    Fede

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Beh... dato che si tratta di una chat, che deve trasferire dati eterogenei (messaggi testuali, informazioni di settaggio tra server e client, parti di file e flag vari) non ho usato proprio un semplice OutputStream, ma mi sono appoggiato ad un ObjectInputStream, ma il meccanismo è lo stesso.
    In fin dei conti c'è un Messaggio (che è un oggetto) che viaggia nella rete che, all'interno, contiene una parte del file che deve essere trasferita.


    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

  6. #6
    si, ho capito. forse io sbaglio xchè utilizzo invece direttamente gli outputstream... beh, ora provo. grazie!
    Fede

  7. #7
    ho provato utilizzando i DataInputStream e DataOutputStream ma nn è cambiato nulla. sembra quasi che la rete s intasi, xchè subito dopo nn, sebbene i processi vengano chiusi la rete rimane cm bloccata. eppure nn ho mai avuto problemi nel trasferimento normale d file, quindi il problema nn risiende nella rete stessa ma nel programma... cm fare???
    Fede

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Prova a postare tutto il codice...


    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

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    95
    Hai provato a bufferizzare lo stream che leggi?

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

    o

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    Nel caso di file bibari è meglio che usi il primo modo.

    poi alla fine fai un in.close() e socket.close()?

  10. #10
    non ho bufferizzato ma ho provato ad usare i DataInputStream e DataOutputStream... leggevo e scrivevo tramite i metodi readByte() e writeByte().

    per quanto riguarda la chiusura dei socket e dei flussi di I/O è tutto ok.

    ho provato a mettere un pò di println nel codice e quello ke ho dedotto è ke il problema risiede probabilmente nel client. legge solo il primo carattere e poi si blocca sulla seconda read

    codice:
    in = new DataInputStream(socket.getInputStream());
    byte b = in.readByte();
    boolean done = false;
    
    while(!done)
    {
      try{b = in.readByte();}
      catch(Exception e) {System.out.println(e.getMessage());done = true;}
    }
    lui praticamente esegue la read fuori dal ciclo, ma non la prima dentro il ciclo. il server invece continua a scrivere e si blocca a circa 8000 byte... probabilmente a quel punto il buffer è pieno, il server rimane in attesa che il client legga i byte e rimane bloccato. difatti nno lancia eccezioni e sono costretto a chiuderlo manualmente. non viene quindi eseguita la chiusura del socket e di conseguenza la rete si blocca.

    il problema è ora individuare la causa della non lettura del client!!!
    Fede

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.