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

    Help Socket

    ciao a tutti raga...!! x fortuna ho trovato questo forum..spero ke potete aiutarmi!!
    io sto facendo una chat..
    ma ho un problema...!
    Io uso un socket x ogni client...e questo socket lo metto dentro ad un array di socket. siccome ho inserito anke l'invio file quando mando un file devo passare alla funzione ke manda e riceve il file l'array di socket!!
    funziona tutto bene...però quando arriva alla chiusura dello Stream letto dal socket x la ricezione ad esempio di una foto. kiudendo lo stream..si kiude anke il socket e l'utente in teoria si disconnette!

    Volevo sapere se si poteva kiudere lo stream del socket senza kiudere il socket..
    grazie!!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ciao e benvenuto.
    Ti invito subito a prendere visione del Regolamento del forum: il titolo delle discussioni deve presentare una breve panoramica del contenuto, senza contenere riferimenti inutili (è inutile indicare parole come "Aiutiìo", "Help", ecc.).
    Altra cosa moto importante: questo è un forum e non un cellulare per SMS con 160 caratteri... hai a disposizione 13.000 caratteri, quindi non sono gradite le abbreviazioni in stile SMS che rendono solo più faticosa la lettura del messaggio.


    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 L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Help Socket

    Originariamente inviato da teooo88ve
    Volevo sapere se si poteva kiudere lo stream del socket senza kiudere il socket..
    No, basta leggere la documentazione di getOutputStream/getInputStream di Socket.

    Closing the returned OutputStream will close the associated socket.

    Closing the returned InputStream will close the associated socket.


    E poi comunque perché dovresti chiudere solo lo stream?? Chiudi il tutto solo quando davvero non ti serve più il Socket! .... quando l'utente desidera terminare la connessione, quando chiudi il programma ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    esatto....il problema è proprio quello!!
    Io quando apro il socket... lo inserisco dentro ad un array di socket.
    io sto facendo questa chat..ma il problema è ke uso lo stesso socket per l'invio dei file!
    io invio il file al server e funziona... il server a sua volta deve mandare il file al destinatario.. e funziona!
    però ad esempio se chiudo lo stream si chiude anke il socket...e quindi perdo la connessione..e il server mi dice che il socket è stato chiuso!
    Se non chiudo lo stream... il socket risulta = null e quindi perdo lo stesso la connessione e se vado ad aprire il file ricevuto e quello mandato mi dice anteprima non disponibile xke lo stream non ha lasciato le risorse..!
    Basterebbe che quando finisco di leggere il buffer il socket non diventasse null ma come se nn mandasse niente..!!

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Cosa significa che "se non chiudi lo stream il socket diventa null"... il Socket non può diventare null da solo...

    Per la trasmissione di file, comunque, solitamente si agisce in due tempi: prima si invia al cliente la dimensione del file, quindi si inviano tutti i byte del file, così il client sa a che punto fermare la lettura dal socket e sa quando chiudere il file di output locale.


    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
    visto che mi hai detto ke ho 13000 caratteri li sfrutto

    le due funzioni FileSend e File f sono quelle x la ricezione e per l'invio dei file...!!
    codice:
    import java.net.*;
    import java.io.*;
    /**
     * 
     * La classe Server racchiude tutti i metodi di invio dei vari messaggi e di comunicazione di eventuali connessioni e disconnessioni degli utenti
     * 
     * */
      public class Server 
    {
        public Connessione[] utenti = new Connessione[20];
        private String ip;
        private ServerSocket server;
        private Socket richieste = new Socket();
        private String result = null;
        public String[] listok = new String[20];
        public int t = 0;
        private int i = 0;
        public String resulto;
        public String mitt;
        public File dest=null;
        public InputStream ricezione;
        public FileOutputStream spedizione;
        public OutputStream www;
        public FileInputStream iii;
        public String destino;
        public Socket ricevi;
        public Socket asfile;
    
        public void Server(){
            try {
                server = new ServerSocket(7007);
                this.run();
            }   catch(IOException e) {
                e.printStackTrace();
            }
        }
        
       public void Ilist(String ricevi) {
            try {
                listok[t] = ricevi;
                t++;
                String invio = null;
                for (int e = 0; e < 20;e++){
                    if (utenti[e].nome == null){}
                    else{
                    invio = utenti[e].nome;
                    }
                    if (invio.equals(ricevi)){
                        for(int o = 0; o < 20 ; o++){
                            if (listok[o] == null){}
                            else{
                                utenti[e].out.println("LISTA;"+listok[o]+";1");
                                //System.out.println(listok[o]);
                            }
                        }
                    }
                }
            }   catch(Exception e) {
                }
        }
       public void BroadAck(String result) {
            try {
                this.result = result;
                for (int j = 0; j < 20;j++){
                utenti[j].out.println(result);
            }
            }   catch(Exception e) {
                e.printStackTrace();
            }
        }
       public void Msg(String mess, String dest, String mitt) {
            try {
                for (int e = 0; e < utenti.length;e++){
                    String invio = utenti[e].nome;
                    if (invio.equals(dest)){
                        utenti[e].out.println("MSG;"+dest+";"+mitt+";"+mess);
                    } else {}
                }
            }   catch(Exception e) {
                e.printStackTrace();
            }
        }
        
        
    
     public void Filef (String mitt,String result) {
         this.destino=result;
         this.mitt = mitt;
         System.out.println("Il server sta mandando il file a:"+result);
      System.out.println( "Server in ascolto..." );
      System.out.println( "Ricezione file in corso..." );
      
       for (int e = 0; e < 2; e++){
                    String invio = utenti[e].nome;
                    if (invio.equals(mitt)){
                        System.out.println("istanzio socket");
                        ricevi = utenti[e].ricevi;
                        System.out.println("a");
                        try{
                            System.out.println(ricevi);
                        ricezione = ricevi.getInputStream();
                        System.out.println(ricezione);
                        System.out.println("b");
                        spedizione = new FileOutputStream( "c:\\FileRicevuto.jpg" );
                        } catch( IOException  huhu) {}
                        System.out.println("c");
                    } else {System.out.println("c1");}
                    System.out.println("giro for");
                }
    System.out.println(ricezione);
                 System.out.println("c2");
    byte buffer[] = new byte[4096];
      long totale = 0L;
      int letti = 0;
      boolean tru=true;
      System.out.println("d");
    while( tru ) {
       try {
       
        letti = ricezione.read(buffer);
        System.out.println("f");
        System.out.println(letti);
        System.out.println("g");
        if( letti>0 ) {
            System.out.println("primo giro");
         spedizione.write( buffer,0,letti );
         totale= totale + letti;
        } else {
            System.out.println("tru = false");
            tru=false;
           }
    }catch( IOException e ) {}
       } 
           
       System.out.println("finito while");
        try{
      
    //spedizione.flush();
     // spedizione.close();
     // ricezione.close(); 
    qua è il mio problema.....e anke sotto!!!
    
    quando ritorno dove ho chiamato questa funzione...se faccio un System.out.println(in.readLine());
    
    quello che ricevo è null...
    e mi da questa eccezione... Exception in thread "Thread-3" java.lang.NullPointerException
    
       
        System.out.println( "Ricezione completata!" );
        File destinatario =new File ("c:\\FileRicevuto.jpg");
        for (int e = 0; e < 2; e++){
                    String invio = utenti[e].nome;
                    if (invio.equals(destino)){
                        utenti[e].out.println("FILOK;");
                        System.out.println("inviato FILOK");
                    } else {System.out.println("c1");}
                    System.out.println("giro for");
                }
        FileSend (destinatario,destino);
       }catch (Exception e){}
    }
    
    public void FileSend (File destinatario,String result) {
    this.dest=destinatario;
    this.result=result;
    
      try{
    System.out.println( "Connessione..." );
        System.out.println("L'ip del file send è"+result);
      System.out.println("Creazione socket");
      for (int e = 0; e < 2;e++){
          System.out.println("a");
                    String invio = utenti[e].nome;
                    System.out.println(invio);
                    if (invio.equals(result)){
                        System.out.println("b");
                         asfile = utenti[e].ricevi;
                         System.out.println(asfile);
                         www = asfile.getOutputStream();
                         System.out.println("c");
                         iii = new FileInputStream(dest);
                         System.out.println("d");
                    } else {}
                }
      System.out.println("e");
      byte buffer[] = new byte[4096];
      long totale = 0L;
      
      System.out.println( "Invio file in corso..." );
      int letti = 0;
      boolean tre = true;
      while( tre ) {
       try {
        letti = iii.read(buffer);
        System.out.println(letti);
        if( letti>0 ) {
         www.write( buffer,0,letti );
         System.out.println(www);
         totale= totale + letti;
        } else {
              
         tre = false;
        }
       } catch( IOException e ) {
        tre = false;
       }
      }
        //www=null;
        //iii=null;
      //iii.close();
     //www.flush();
      //www.close();
     
      System.out.println( "Invio file terminato [" + totale + " bytes inviati]" );
      
    }catch (IOException e){}
    
    }
        
        public void run() {
            try{
                while(true){
                    richieste = server.accept();
                    utenti[i] = new Connessione(richieste,this);
                    i++;
                }
            }   catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da teooo88ve
    le due funzioni FileSend e File f sono quelle x la ricezione e per l'invio dei file...!!
    Il codice comunque è molto poco comprensibile ... già solo per la indentazione completamente inadeguata ...

    Ad ogni modo segui quanto ti ha detto correttamente LeleFT. Quando devi gestire comunicazioni di questo tipo dovresti innanzitutto studiare un apposito "protocollo di comunicazione", cioè semplicemente delle regole che stabiliscono che cosa i due host devono aspettarsi e cosa devono inviare man mano che la comunicazione prosegue.

    Un esempio banale di "protocollo di comunicazione" potrebbe essere:

    a) Il server si aspetta 1 byte che indica il tipo di richiesta. Se il valore è 10 mettiamo che sia il trasferimento di un file.
    b) Se è un trasferimento di un file, il server si aspetta 4 byte che formano un int che indica la lunghezza del file.
    c) Una volta ricevuta la lunghezza, il server si aspetta N byte (N il numero appena ricevuto) che sono il contenuto del file.
    d) Il server ritorna alla fase a)

    Questo ti permetterebbe di realizzare una comunicazione più affidabile e con la possibilità di poter fare, eventualmente, più tipi di operazioni.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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

    Moderazione

    A titolo informativo: quando devi postare del codice, postalo all'interno dei tag [code] e [/code] così rimane leggibile (per la formattazione del carattere monospaced) e indentato.


    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
    ok pardon!!
    e l'ho già fatto sai.....
    secondo te tutti quei ("CONN" ("REG"); ("MSG")...ecc
    cosa sono ???
    ho già fatto tutto e il protocollo di trasmissione è già fatto...!!
    la chat funziona benissimo ed è solo l'invio dei file che nn va....!!

  10. #10
    hmm creare un altro socket per solo l'invio di file?
    Write Once, Run Everywhere.
    Write Less, Do More.

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.