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

    Svuotare BufferedReader

    Salve, scrivo perchè ho un problema con un BufferedReader, ossi vorrei sapere come fare per "svuotarlo" ad un certo punto nel codice. In particolare ho un problema con un socket TCP:
    Ho fatto un piccolo codice di esempio che riassume la situazione, il server ha questo comportamento
    codice:
    public static void main(String argv[]) throws Exception {        ServerSocket welcomeSocket = new ServerSocket(6789);
    
            while (true) {
                Socket connectionSocket = welcomeSocket.accept();
                BufferedReader in
                        = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                DataOutputStream out = new DataOutputStream(connectionSocket.getOutputStream());
    
                out.writeBytes("Important Message\n");
                out.writeBytes("Not important Message 1\n");
                out.writeBytes("Not important Message 2\n");
                out.writeBytes("Not important Message 3\n");
    
                if ("query".equals(in.readLine())) {
                    out.writeBytes("Data\n");
                }
            }
        }
    Ossia invia 4 stringhe alla connessione (di cui solo la prima ha interesse) e poi un altra stringa quando riceve la stringa "query"

    Il client è cosi:
    codice:
    public static void main(String argv[]) throws Exception {        String message;
            try (Socket clientSocket = new Socket("localhost", 6789)) {
                DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                message = in.readLine();
                System.out.println(message);
    
                // Qualcosa per svuotare il BufferedReader in
    
                Thread.sleep(500);
                out.writeBytes("query\n");
                message = in.readLine();
                System.out.println("Received::" + message);
            }
        }
    Mi manca il codice da inserire al posto del commento per scartare i vari "Not important Message" alla connessione.
    Qualcuno sa aiutarmi?
    Grazie in anticipo.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Fai semplicemente tante letture a vuoto quanti sono i "Not important Message".

    codice:
    message = in.readLine();
    System.out.println( message );
    
    // Se ci sono 3 righe "Not Important"
    for(int i=0; i<3; i++) {
       // Leggo a vuoto
       in.readLine();
    }
    
    // Resto dell'esecuzione e delle letture da server
    ...

    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
    Quote Originariamente inviata da federico.massim Visualizza il messaggio
    Mi manca il codice da inserire al posto del commento per scartare i vari "Not important Message" alla connessione.
    in.readLine(); senza usare la stringa restituita .... non c'è da "svuotare" nulla.


    Inoltre ci sarebbero un po' di questioni su come hai gestito il tuo protocollo di comunicazione, già dal lato server-side si capisce che avendo usato InputStreamReader, il charset utilizzato è quello di default della piattaforma e che può quindi differire da quello del client (già questo non è molto appropriato in generale...). Poi nell'altro senso hai usato dei writeBytes, che scrivono i caratteri scartando il byte alto del char.
    Consiglio: cerca di pensare meglio il protocollo di comunicazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    @andbin: Il protocollo non è questo, il codice che ho scritto è solo un esempio che ho buttato giù per far capire la situazione.

    Il problema di fare vari readline() è che non so bene quanti sono le righe in più, ossia nell'esempio che ho fatto sono 3 ma in generale non lo so, potrebbero essere 0 come 10 o 100.
    Ho provato a fare una cosa come
    codice:
    while(in.readLine() != null)
    Ma non funziona dato che il programma si blocca e aspetta che il server mandi qualcosa fino a far scattare il timeout.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Allora la domanda era mal posta.
    Con quale criterio una riga deve essere considerata "da scartare"?
    Dal punto di vista del client, ciò che c'è sulla socket è "roba che gli arriva dal server"... come fa a distinguere la "roba buona" da "quella da scartare"?

    Se c'è qualcosa nel dato letto che ti fa capire che è da scartare, usalo per scartare...
    Ad esempio, se tutte le righe da scartare iniziano con la stringa "Not important":

    codice:
    String line = null;
    while((line = in.readLine()) != null) {
       if ( !line.startsWith("Not important") ) {
          // La riga è buona...
       }
    }

    Con questo esempio tutte le righe che iniziano con "Not important" vengono "scartate", cioè non entri nel if e passi alla successiva.


    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

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da federico.massim Visualizza il messaggio
    @andbin: Il protocollo non è questo, il codice che ho scritto è solo un esempio che ho buttato giù per far capire la situazione.
    Ok

    Quote Originariamente inviata da federico.massim Visualizza il messaggio
    è che non so bene quanti sono le righe in più
    E questo invece è proprio, appunto, questione di "protocollo", che devi scegliere/valutare tu!
    Quando si gestiscono protocolli "binari" in cui si deve inviare un blocco di byte, la soluzione in genere è anticipare al destinatario il numero di quanti byte si deve aspettare.
    Nel caso di protocolli "testuali" (e in genere fatti "a righe"), le cose vanno e possono andare anche diversamente. Una soluzione è inviare in anticipo una riga con il numero di righe es. "3". Un'altra soluzione è utilizzare un marcatore finale delle righe, es. una riga vuota o con un contenuto speciale, che sia certamente inequivocabile rispetto ai dati veri e propri.

    Tu dici "Il protocollo non è questo" ma il punto è proprio quello. Se lo puoi/devi scegliere tu ... allora inventatelo! Altrimenti se ti è stato imposto/suggerito, allora dicci quale è ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Il protocollo non lo faccio io è imposto e funziona cosi:
    Quando ci si connette il server manda un intestazione e tutti i dati che ha disponibili, un esempio potrebbe essere :

    TYPE;DATE;ARGS;DST\n
    5;22012015;125,124,263,2\n
    5;22012015;47,122,3,5\n
    5;22012015;12,9,25,7\n
    ........ e altri in numero non determinato.

    Al client, in questa fase interessa però solo la prima riga, l'intestazione, cioè: "TYPE;DATE;ARGS;DST\n", e la prende facendo un readline() appena dopo la connessione.

    Durante l'esecuzione del programma, quando il client ha bisogno di un determinato dato, fà un richiesta al server e chiede il dato, il server risponde con una cosa del genere "5;22012015;12,9,25,7\n". Il problema è che dopo aver fatto la richiesta, se il client fa una readline() non trova la risposta alla sua richiesta, ma trova tutte le righe che il server ha mandato durante la connessione, ed in fondo al buffer la risposta.

    Quello che devo fare é:
    1) connettermi al server
    2) leggere l'intestazione ("TYPE;DATE;ARGS;DST\n") con una readLine()
    3) svuotare il buffer da tutte le righe che mi ha mandato e che non mi servono.
    4) fare la mia richiesta al server
    5) leggere la risposta dal buffer, che essendo stato svuotato nel punto 3 so che contiene solo la risposta e la posso leggere con un readline()

    Quello che non so come fare è il punto 3.

Tag per questa discussione

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.