Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    23

    [JAVA] Problema con Socket

    Ciao a tutti.
    Ho un piccolo problema con una socket, che vi illustro di seguito.
    Devo fare un trasferimento file da server a client.
    Il primo file viene trasferito correttamente, mentre se provo a trasferirne un altr dopo, sulla stessa connessione, mi da un errore nel metodo write del DataOutputStream.
    Vi lascio qui un frammento di codice (scriverlo tutto servirebbe solo a creare caos):

    codice:
    public static void dataconn(DataOutputStream datas,DataInputStream in,String req) throws IOException{
                    String[] s=req.split(" ");
                    System.out.println("Richiesta del file: "+s[1]);
                    switch(Stato.valueOf(s[0])){
                        case get:
                        File f=new File(s[1]);
                        FileInputStream in_f = new FileInputStream(f);
                        int dim = (int)f.length();
                        System.out.println("Dimensione file: "+dim+" byte");
                        byte []data = new byte[dim];
                        in_f.read(data, 0, dim);
                        datas.write(data, 0, dim);
                        datas.close();
                        in_f.close();
                        System.out.println("Invio del file "+s[1]+" terminato");
                        break;
            }
        }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Java ha un forum dedicato.
    Inoltre, come espressamente indicato nel Regolamento interno, il codice va postato indentato all'interno degli appositi tag CODE.
    Altra cosa: non è sufficiente dire "mi dà un errore". Devi sempre dire quale errore viene visualizzato... altrimenti costringi la gente a copiare, incollare, compilare ed eseguire il tuo codice (cosa non sempre fattibile, mai richiedibile).

    Comunque, da una breve e veloce letta, mi pare di capire che tu stia chiudendo la socket:

    codice:
    datas.close();
    Ovviamente non va fatto, se vuoi poter inviare altri dati al client.


    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
    Jul 2009
    Messaggi
    23
    dtaas non è la socket, ma il DataOutputStream e se non lo chiudo , non scrive niente sul client (rimane tutto nel buffer).

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Y2J
    dtaas non è la socket, ma il DataOutputStream e se non lo chiudo , non scrive niente sul client (rimane tutto nel buffer).
    Usa flush() per svuotare il buffer :master:
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Alex'87
    Usa flush() per svuotare il buffer :master:
    Esatto. Se tu chiudi il wrapper dell'output stream della socket (che sia un DataOutputStrea, un FileOutputStream, un ObjectOutputStream o quel che ti pare), automaticamente chiudi anche l'output stream della socket.

    The close method of FilterOutputStream (da cui deriva DataOutputStream, n.d.r) calls its flush method, and then calls the close method of its underlying output stream.
    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
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    23
    ho già provato col metodo flush() della classe DataOutputStream ma mi blocca il client.
    Vi riporto qui 1 pò di codice lato client...

    codice:
    DataInputStream in=new DataInputStream(data.getInputStream());
                while(!dgt.equals("esci")){
                    System.out.print("ftp:>");
                    dgt=digit.readLine();
                    System.out.println(dgt);
                    toServer.writeBytes(dgt+"\n");
                    String[] s=dgt.split(" ");
                    if(s[0].equals("get")){
                        byte b[] = new byte[1];
                        FileOutputStream fos = new FileOutputStream(s[1]);
                        while(in.read(b)!=-1)
                        {
                            fos.write(b);
                        }
                        fos.close();
                      }
                    }
                in.close();

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    23
    ok, raga si può kiudere.
    ho modificato il sorgente del client con un nuovo ciclo while e sembra andare tt alla meraviglia.

    P.S: GRAZIE a tutti!!!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: Moderazione

    Originariamente inviato da LeleFT
    come espressamente indicato nel Regolamento interno, il codice va postato indentato all'interno degli appositi tag CODE.
    Magari, se te l'ho suggerito c'è anche un motivo...


    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.