Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    SOcket maleducata...(Aiuto progetto esame urgente)

    Ciao a tutti... Ho un disperato bisogno di chiuque possa aiutarmi :master: Devo realizzare un'applicazione client server su socket java TCP. Il client invia un file al server, che controlla se è corretto e risponde di conseguenza al client. E' quest'ultima comunicazione che non mi funziona Vi prego ho urgente bisogno per l'esame.Grazie per l'interessamento Qui sotto i file:

    SERVER

    ...
    ...
    ServerSocket ss = new ServerSocket (7000); //creazione della socket

    while(true){
    Socket client = ss.accept(); //il server è in ascolto e appena un client lo contatta avvia una connesione

    DataOutputStream messaggio =new DataOutputStream(client.getOutputStream());
    ObjectInputStream ois = new ObjectInputStream( client.getInputStream() );
    FileOutputStream fos = new FileOutputStream( "C:\\utenti\\temp.xml" ); // Creo il file di output temporaneo

    byte buffer[];
    try {
    while ( true ) {
    buffer = (byte[]) ois.readObject();
    fos.write( buffer ); //riempio il file con i dati che arrivano dal client
    }
    }catch (Exception eofe) {
    fos.close(); //arrivo qui perchè il file è finito quindi chiudo quello di destinazione
    }
    //ois.close(); //chiudo il canale dello stream con il client

    File dir = new File ("C:\\utenti\\");// se non esiste creo la directory utenti
    String lista[] = dir.list();
    boolean trovato=false;
    nf=NomeFile(); // mi salvo l'username del file appena creato e...

    for(int i=0;i<lista.length && !trovato;i++){
    if(!trovato && lista[i].equals(nf+".xml")){ //... se già esiste un file che si chiama cosi
    System.out.println("File esistente in server");
    messaggio.writeBytes("ko"); trovato=true;
    }
    }

    if (!trovato) { // se invece non esiste il file
    risultato=validazione(); // applico la validazione al temporaneo
    if (risultato){ //nel caso vada tutto bene

    File vecchio = new File ("C:\\utenti\\temp.xml");
    File nuovo = new File ("C:\\utenti\\" + nf + ".xml"); //creo effettivamente il file xml finale duplicando il temporaneo

    FileReader in = new FileReader (vecchio);
    FileWriter out = new FileWriter(nuovo);
    int c;
    while((c=in.read())!=-1){
    out.write(c);
    }
    in.close();
    out.close();
    }
    }

    CLIENT

    public void RegistrazioneClient(String file) {

    try{

    Socket s = new Socket("localhost", 7000); //Costruzione della socket
    FileInputStream fis = new FileInputStream(file); //Oggetto per leggere il file da inviare
    ObjectOutputStream oos = new ObjectOutputStream( s.getOutputStream() ); //oggetto per inviare il file
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(s.getInputStream())); //Oggetto per ricevere messaggi dal server

    byte [] buffer = new byte[4096]; //Inizio codice di invio file
    byte [] bufOut;
    int len = 0;
    while((len = fis.read(buffer)) > 0) { //per ogni blocco di 4 kb....
    if (len < 4096) {
    bufOut = new byte[len];
    for(int i=0; i<len; i++) bufOut[i] = buffer[i];
    } else {
    bufOut = (byte[]) buffer.clone();
    }
    oos.writeObject( bufOut ); //Invio del file a blocchi di 4 kb
    oos.flush(); //Fine codice invio file
    }
    fis.close(); //Chiusura del file generato dalla registrazione e che ho inviato al server

    // attendo che il server mi dica se esiste già un utente registrato con l'username corrente

    if (inFromServer.readLine()=="ko"){ //non mi risponde!!!
    JOptionPane.showMessageDialog(getContentPane(),"De vi cambiare l'username");
    return;
    }else{
    JOptionPane.showMessageDialog(getContentPane(),"Re gistrazione completata");


    }

    s.close(); //Chiusura socket


    }catch(Exception e){System.out.print(e.getMessage());}
    }

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

    Moderazione

    Tutte le discussioni del forum hanno la stessa urgenza.

    Ad ogni modo, le stringhe non si confrontano con l'operatore ==, ma usando il metodo equals().


    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
    Che svista! VVoVe: Speriamo che sia quello l'errore... appena provo vi faccio sapere. Ciao

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Altra cosa: quando si ha a che fare con comunicazioni via socket è bene forzare sempre un flush() dopo ogni scrittura per evitare la bufferizzazione dei dati.


    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

  5. #5
    Ed io aggiungo, per esperienza personale. Prima chiudi il socket meno casini avrai!! :'(

  6. #6
    Ciao! Allora ho provato a fare quello che mi avete consigliato ma niente di nuovo purtroppo... Ho corretto l'errore sul confronto stringhe, ho evitato di chiudere canali che mi portassero a chiudere anche la socket, ma adesso il risultato è che mi si blocca il client, i file arrivano correttamente al server ma poi quest'ultimo non risponde al client... Come potrei risolvere?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Cosa vuol dire che il server non risponde 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

  8. #8
    Ciao! Vi illustro la situazione:
    1) Il client spedisce il file al server
    2) il server lo riceve regolarmente e verifica se può salvarselo
    3) in entrambi i casi (cioè se può salvarlo o meno)il server deve rispondere al client con un messaggio

    Il programma si blocca al punto 3 cioè non avviene la trasmissione dell'ultimo messaggio.

    Sono riuscito a spiegarmi?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Nel codice che hai postato sopra vedo che viene inviato un messaggio (messaggio.writeBytes() ?) solo nel caso che il file esista già.
    Nel caso in cui il file non esista, tu lo crei, lo ricevi e chiudi la connessione senza inviare nulla 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

  10. #10
    Hai ragione!! L'ho corretto subito ma adesso dà errore alla nuova riga di codice che inserisco. Ti posto il pezzo di codice:

    if (!trovato) { // se invece non esiste il file
    out1.writeBytes("ok"); //dico al client che è tutto ok
    risultato=validazione(); // applico la validazione al temporaneo

    Il programma si blocca e quando termino il client(uso eclipse) mi da questo errore: Connection reset by peer: socket write error.
    Sbaglio la posizione dove inserire l'invio del messaggio? Grazie. Ciao Ciao

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.