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

    [java]Botta e risposta client-server

    Ciao a tutti! Essendo un pò nuovo con le socket ho dei problemi a fare una comunicazione client-server dove prima il client manda una richiesta e il server la ascolta, dopidichè il server manda la risposta e il client la ascolta.

    SERVER:
    codice:
    //attendo la richiesta
    serverSocket = new ServerSocket(port);
    socket = serverSocket.accept(); 
    
    InputStream is = socket.getInputStream();
    BufferedReader dis = new BufferedReader(new InputStreamReader(is));
    
    String temp = new String();
    String request = new String();
    while((temp = dis.readLine()) != null)
    {
    	request += (temp + "\n");
    }
    
    //elaboro la richiesta e rispondo
    
    OutputStream os = socket.getOutputStream();
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    
    bw.write(message);
    bw.close();
    socket.close();
    CLIENT:
    codice:
    String request = new String();
    request = "GET";
    
    OutputStream os = socket.getOutputStream();
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    
    bw.write(request);
    bw.close();
    
    //ho mandato il messaggio al server, ora lui mi deve rispondere
    InputStream is = socket.getInputStream();
    BufferedReader dis = new BufferedReader(new InputStreamReader(is));
    
    String temp = new String();
    while((temp = dis.readLine()) != null)
    {
            testo += (temp + "\n");
    }
    
    socket.close();
    Allora: il punto è che una volta che sul client faccio bw.close() non posso fare nient'altro perchè mi lancia un'eccezione di socket chiusa. Se non faccio la bw.close ma la bw.flush è il server a non ricevere niente e resta in attesa infinita.

    Un ringraziamento a tutti e un bacio a chi mi risolve questo grattacapo. E' da ieri che sto sbattendo la testa contro il muro.

    ciao ciao

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    La close() non la devi fare, se non alla fine delle comunicazioni (la close() chiude la socket).
    Quello che devi fare è riprogettare un attimo il server, o meglio, il tuo protocollo di comunicazione.

    Ad esempio, per indicare al server che hai finito di mandargli i dati, potresti mandargli una stringa fissa ("END"). Quando il server riceve questa stringa, smette di leggere.

    Nel tuo caso, infatti, il server continua a leggere finchè non incontra la fine del file (ovvero, finchè non viene chiusa la socket... ma se la socket è chiusa, la comunicazione viene interrotta).

    Quindi, il cilent invierà la richiesta al server e gli comunicherà che ha finito l'invio (nell'esempio che ti ho proposto, invierà la stringa "END").

    Il server leggerà tutto quello che gli arriva finchè non incontra la stringa "END". A quel punto potrà procedere.

    E' tutta questione di progettare bene il protocollo di comunicazione.


    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
    Ci sono diverse questioni. Innanzitutto se chiudi alla fine il socket, automaticamente chiude i due InputStream/OutputStream.

    Comunque nel client dopo la write dovresti fare un flush(), non un close(). Ma il problema non è solo questo. Il server si aspetta un numero arbitrario di "righe" e resta sempre in attesa!!! E tu nel client invece non invii una "riga" ma solo una stringa "GET", senza alcun newline dietro.

    Devi rivedere questo "tuo" protocollo di comunicazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    grazie mille, messaggio assimilato ed ora le cose funzionano. molto gentili

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.