Problema socket-Ristorante

di il
6 risposte

Problema socket-Ristorante

Salve a tutti, devo svolgere un progetto con alcuni miei compagni.
Ciò che abbiamo pensato di creare è un sistema che gestisce alcune funzionalità in un ristorante.
Ci sono 3 classi principali: Un client CLIENTE e due server CUCINA e CASSA.
In pratica, il cliente dopo aver scelto tutte le pietanze da ordinare (scrivendo su console solo il numero identificativo delle pietanze separate da virgola), quando è pronto per effettuare l'ordine allora viene inviata una stringa (contenente dettagli ordine) tramite socket ai due server cucina e cassa.
Fin qui tutto bene...
A questo punto però nasce un problema, ovvero il client riesce a connettersi ai due server ma -a quanto pare- i due server non riescono a ricevere la stringa.
La cosa è alquanto strana, infatti in un altro progetto che avevo fatto solo per testare l'invio dei messaggi tramite socket tutto andava bene e il server riceveva.
Andando a confrontare i due codici non riesco a trovare quali differenze vi siano che causino il malfunzionamento.

Vi passo il link github, nella speranza che qualcuno più esperto di me mi sappia suggerire dove sta il problema.

https://github.com/sataraja/Ristorant

Il codice compila perfettamente, dovete importare nel progetto le due librerie prog contenute nella cartella.
Dato che lo stesso problema si presenta sia per quanto riguarda l'invio al server cucina che al server cassa, potete guardare soltanto il codice che riguarda cliente e cucina...

Grazie mille a chi mi aiuterà.

6 Risposte

  • Re: Problema socket-Ristorante

    g.lombardo4 ha scritto:


    A questo punto però nasce un problema, ovvero il client riesce a connettersi ai due server ma -a quanto pare- i due server non riescono a ricevere la stringa.
    Quando si scrive su un socket (sul suo stream), va sempre fatto un flush() per assicurare l'invio.
  • Re: Problema socket-Ristorante

    Va bene, allora provo ad aggiungere un flush() e vediamo se funziona
  • Re: Problema socket-Ristorante

    Ho provato ad aggiungere il flush() ma non risolve il problema...
  • Re: Problema socket-Ristorante

    g.lombardo4 ha scritto:


    Ho provato ad aggiungere il flush() ma non risolve il problema...
    Il flush() comunque va fatto sempre. Però c'è dell'altro. Nel CASSA fai un in.readLine(). Tra l'altro, readLine() di DataInputStream è deprecato, non si dovrebbe più usare. Comunque, riceve una "riga" cioè una stringa terminata dalla sequenza del newline. Se non riceve il newline, resta lì in attesa ...
    E dall'altra parte fai

    out1.writeBytes(""+ ID_CLIENTE +","+ ordine.toString()); //invio a cucina
    out2.writeBytes(""+ ID_CLIENTE +","+ ordine.toString()); //invio a cassa

    dove sta il newline? non c'è qui ....

    Insomma, DataInputStream non è nemmeno il più appropriato se il "protocollo" è di scambio è testuale a righe.
  • Re: Problema socket-Ristorante

    Ok grazie per il suggerimento. Proprio pochi minuti fa sono riuscito a risolvere il problema che avevo. In effetti piuttosto che usare il readLine ho usato il writeUTF() e readUTF, e inoltre ho inserito il .close() sia per l'oggetto di DateInputStream che di DateOutputStream.

    Grazie per il vostro aiuto comunque. Terrò a mente il suggerimento.
  • Re: Problema socket-Ristorante

    g.lombardo4 ha scritto:


    In effetti piuttosto che usare il readLine ho usato il writeUTF() e readUTF
    writeUTF/readUTF di per sé vanno bene, perché sono assolutamente "simmetrici" e questo è ok. Ma sappi che in questo modo il "protocollo" sullo stream del socket non è più di "testo puro" perché quei metodi trattano un piccolo header (la lunghezza della stringa) scritto come valore short binario.

    g.lombardo4 ha scritto:


    e inoltre ho inserito il .close() sia per l'oggetto di DateInputStream che di DateOutputStream.
    Ricorda che i close() andrebbero sempre fatti nel finally di un try. O in alternativa sfruttando il try-with-resource.
Devi accedere o registrarti per scrivere nel forum
6 risposte