PDA

Visualizza la versione completa : [JAVA] Socket Stream


79Cloud79
11-01-2005, 11:59
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



//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;

LeleFT
11-01-2005, 12:21
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. :ciauz:

79Cloud79
12-01-2005, 11:40
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.

LeleFT
12-01-2005, 11:47
Prova a modificare il codice in questo modo:


...
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. :ciauz:

79Cloud79
12-01-2005, 11:52
già provato, niente da fare....

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

tipo



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

LeleFT
12-01-2005, 11:55
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. :ciauz:

79Cloud79
12-01-2005, 12:00
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

Loading