Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    142

    evitare loop readLine() in comunicazione locale

    Ciao,

    con la classe Process sto facendo comunicare un programma java ad un eseguibile che ho nel pc. Per quel che ho capito, il protocollo di comunicazione definito da questo eseguibile non termina i propri messaggi con un "bye" o qualcosa di riconoscibile. Ogni messaggio è fatto di tante stringhe separate da una newline, e dopo l'ultima stringa c'è soltanto la solita newline.

    Come conseguenza il readLine del BufferedReader si blocca in attesa.

    C'è un modo tipico per aggirare questo problema? Mi pareva di ricordare qualche trucco con oggetti di più basso livello (InputStream), ma non riesco. Ovviamente non ho un Socket su cui impostare il timeout.

    Il protocollo in questione è http://wbec-ridderkerk.nl/html/UCIProtocol.html

    Grazie, ciao!
    <esistono cose che non esistono>

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    142
    Ciao,

    ho ritrovato lo "schema" che mi pareva di ricordare, ovvero, utilizzando un InputStream, fare una cosa di questo tipo

    codice:
    while (inputStream.available() > 0) {
         int i = inputStream.read(tmp, 0, 1024);
         if (i < 0)
              break;
         strBuff.append(new String(tmp, 0, i));
    }
    Tuttavia nel mio caso continua a non funzionare, perchè (è una mia supposizione) la chiamata available() ritorna zero anche quando non dovrebbe, perchè lo stream non è ancora arrivato, e quindi la comunicazione va a farsi benedire.

    Altre idee sono benvenute, grazie

    EDIT!
    Appena ho finito di scrivere mi è venuto in mente che potevo aggiungere una semplice riga, per aspettare che la comunicazione iniziasse! Quindi ho provato con uno schema di questo tipo:

    codice:
    while (inputStream.available() <= 0) {}; // busy waiting
    while (inputStream.available() > 0) {
         int i = inputStream.read(tmp, 0, 1024);
         if (i < 0)
              break;
         strBuff.append(new String(tmp, 0, i));
    }
    e sembra funzionare. Certamente il busy waiting non è la miglior soluzione possibile, quindi resto in attesa di altri suggerimenti.

    Ciao
    Ultima modifica di Pete; 18-02-2014 a 13:50
    <esistono cose che non esistono>

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.