Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA] Socket Stream

  1. #1

    [JAVA] Socket Stream

    Buongiorno a tutti.

    Ho un problema con un semplice serversocket scritto in java.

    Il mio server attende connessioni su una determinata porta, una volta ricevute prende la richiesta la elabora e risponde (tutto in XML).

    Il problema sta nel fatto che quando invio la risposta il client non la riceve, in quanto dopo averla inviata chiudo gli stream e il socket e questo crea problemi nella ricezione.

    Come posso ovviare il problema senza far rimanere il mio thread aperto all'infinito?

    Posto il codice

    codice:
    //prendo i buffer di scrittura e lettura
                PrintWriter out = new PrintWriter(cltSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(cltSocket.getInputStream()));
                
                //prendo la risposta
                while ((inputLine = in.readLine()) != null){                
                    if (inputLine.equals(CRLF) || inputLine.equals("")){
                        break;   
                    }
                }
                
                //prendo il codice XML da restituire
                sRitorno = "<html><body>Error: Request not recognized<hr>" + inputLine + "<hr></body></html>";
    
                //lo invio
                out.println(sRitorno);
                            
                System.out.println("Sto uscendo");
                
                //chiudo i buffer
                in.close();
                out.close();
                
                //chiudo il socket
                cltSocket.close();
                cltSocket = null;

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non penso proprio che esistano alternative: il client deve rimanere attivo e con gli stream aperti finchè essi non sono più utili. Gli stream di I/O non sono più utili nel monento in cui cli client non deve più ricevere/inviare dati. Quindi uno stream di output va chiuso solo quando il client non deve più inviare dati, mentre uno stream di input va chiuso solo quando il client non deve pià ricevere dati. Non puoi, quindi, chiudere lo stream di input se il client deve ricevere ulteriori dati dal server.... puoi fare questa scelta: una volta che il client ha ricevuto i dati dal server, se questo client non deve pià riceverne, chiudi gli stream.

    I thread, poi, sono stati inventati apposta per evitare che un certo processo appesantisca il lavoro della CPU: un thread, quando è inattivo (temporaneamente bloccato, quindi) viene automaticamente deschedulato e non appesantisce la CPU finchè non è di nuovo il suo turno.

    Questo modo di pensare è congeniale proprio nelle architetture di rete (come architetture client/server) in cui una applicazione non può "rubare" troppa CPU, ma compete per essa attraverso i thread.


    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
    il problema è proprio quello,

    cioè quando ho inviato la risposta al client (in questo caso quella stringa HTML) non devo più ne inviare ne ricevere dati, per questo chiudo stream e socket.

    Purtroppo però il comando out.println(sRitorno) seguito dalla chiusura è come se non facesse nulla.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Prova a modificare il codice in questo modo:
    codice:
    ...
    out.println(sRitorno);
    out.flush()
    ...
    A volte l'output rimane nel buffer dell'oggetto se questo è di pochi byte (o troppo pochi rispetto al minimo inviabile), quindi non viene inviato. Il metodo flush() forza l'invio dei dati anche se questi sono in quantità inferiore al minimo.


    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
    già provato, niente da fare....

    la cosa strana è che se invece di fare così provo ad inviare pacchetti di byte

    tipo

    codice:
    byte[] buffer = new byte[1024] ;
    int bytes = 0 ;
    	
    // Copy requested file into the socket's output stream.
    while ((bytes = fis.read(buffer)) != -1 ) {
          out.write(buffer, 0, bytes);
    }
    la ricezione funziona

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Il client è scritto in Java? Che tipo di dati si aspetta di ricevere? Io ho avuto lo stesso problema con un Server scritto in ASPX con un client scritto in Java: il client, per comunicare, doveva inviare uno stream di byte e non tipi di dato strutturati, altrimenti il server, dall'altra parte, non li riceveva correttamente...


    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

  7. #7
    mi sa che è proprio quello il problema.

    Infatti con una mia applicazione di prova scritta in Java riesco ad ottenere tranquillamente le risposte,

    mentre sia se faccio prove con il browser sia se le faccio con il client (non l'ho scritto io ma credo non sia Java) non legge dati strutturati ma solo pacchetti di byte.

    Grazie mille per l'aiuto

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.