Programmazione di rete[JAVA]

di il
28 risposte

28 Risposte - Pagina 2

  • Re: Programmazione di rete[JAVA]

    JAVA2222 ha scritto:


    non essendoci nessun messaggio perché il client non ha ancora premuto il pulsante per inviarlo, si blocca e dà l'errore
    readObject() è "bloccante", nel senso che se il client non invia nulla, sta in attesa e basta. E ritorna (con un oggetto) solo a seguito della deserializzazione completata di un oggetto.
    Se succede qualcosa di diverso da questo, tipo un errore, al 99,9% è perchè è stato fatto qualcos'altro che non è molto appropriato.
  • Re: Programmazione di rete[JAVA]

    Ho risolto per l'output usando un PrintStream, ma per l'input cosa uso? C'è un corrispondente di PrintStream?
  • Re: Programmazione di rete[JAVA]

    JAVA2222 ha scritto:


    Ho risolto per l'output usando un PrintStream, ma per l'input cosa uso? C'è un corrispondente di PrintStream?
    Se il "protocollo" di comunicazione è "a righe di testo", allora per leggere "righe" ci sono tecnicamente diversi modi: con BufferedReader o con Scanner. Ma essendo una comunicazione su socket e che può tecnicamente dare problemi sul I/O, meglio BufferedReader.

    E già che siamo in tema, è bene che affronti una questione, se non l'hai già fatto. Fino a quando usavi la "serializzazione" degli oggetti, se invii un String, ci pensa la serializzazione a generare tutto lo stream di byte appropriato per la stringa e non ti devi preoccupare di nulla altro sulla codifica.
    Se invece su socket vai a scrivere/leggere tu "righe" di testo o comunque in generale sequenze di caratteri, allora DEVI preoccuparti del charset usato per la conversione char <-> byte.

    E siccome client e server potrebbero stare su macchine differenti e quindi avere un charset di default differente, allora vuol dire in generale che in questi casi DEVI imporre tu un charset ben preciso per la codifica, altrimenti rischi problemi con i caratteri.
    Generalmente/tipicamente si sceglie UTF-8 perché è compatto e non fa "perdere" nulla del Unicode.
  • Re: Programmazione di rete[JAVA]

    Grazie molte della risposta. Invece mi consiglia di usare, per l'output, PrintStream o BufferedWriter?
  • Re: Programmazione di rete[JAVA]

    JAVA2222 ha scritto:


    per l'output, PrintStream o BufferedWriter?
    PrintStream è una classe di "convenienza" che va bene in casi basilari e senza troppe pretese (di fatti il famoso System.out su cui si fanno print/println è un PrintStream).
    Il lato negativo di PrintStream è che i print/println NON lanciano fuori IOException. Le eccezioni vengono "mangiate" e puoi sapere se c'è stato un errore solo con il checkError().

    Nell'ottica di uso su socket, meglio BufferedWriter.
  • Re: Programmazione di rete[JAVA]

    Che metodo usano BufferedWriter e BufferedReader per scrivere e leggere dati(i dati a il client li scrive in una textField)
  • Re: Programmazione di rete[JAVA]

    JAVA2222 ha scritto:


    Che metodo usano BufferedWriter e BufferedReader per scrivere e leggere dati(i dati a il client li scrive in una textField)
    Tieni sempre a portata di ... mouse la documetazione javadoc del framework.
  • Re: Programmazione di rete[JAVA]

    Ok.
    Un'altra cosa: quando per esempio si genere un'eccezione e il programma si blocca, i socket si chiudono vero? Non vorrei creare un sovraffollamento della rete o qualcosa del genere...
  • Re: Programmazione di rete[JAVA]

    JAVA2222 ha scritto:


    quando per esempio si genere un'eccezione e il programma si blocca, i socket si chiudono vero?
    No, solo per una qualunque eccezione, il socket non si chiude. È il programmatore che deve assicurarsi di fare in modo che tutte le risorse (socket, stream o altro) vengano SEMPRE chiuse, in qualunque scenario.

    E questo vuol anche dire saper sfruttare in modo appropriato il try-finally o il nuovo "try with resources" di Java 7.
  • Re: Programmazione di rete[JAVA]

    Esatto io ho messo tutte le operazioni dentro un blocco try e poi un finally che chiude tutto, così dovrebbe chiudersi vero?
  • Re: Programmazione di rete[JAVA]

    Però ho pensato che anche così, se io blocco il programma mentre sta andando, i socket per forza non sib bloccano...
  • Re: Programmazione di rete[JAVA]

    JAVA2222 ha scritto:


    se io blocco il programma mentre sta andando, i socket per forza non sib bloccano...
    Che vuol dire???
  • Re: Programmazione di rete[JAVA]

    Cioè che il server, su eclipse, è a riga di comando. Se io blocco il programma dal server con il pulsante di eclipse che fa terminare il programma, solo i client arrivano al blocco finally, perché si genera un'eccezione, mentre se blocco il client solo il server arriva arriva al blocco finally.
  • Re: Programmazione di rete[JAVA]

    Ma quindi è possibile che ci siano ancora socket in ascolto su delle porte? Se si, come faccio a chiuderli tutti?
Devi accedere o registrarti per scrivere nel forum
28 risposte