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

    lettura di dati da un socket

    salve

    sto creando un applicazione desktop java che legge i dati scritti su un socket da un altro dispositivo (un PLC). In sostanza, il PC deve fare da client,il PLC da server. Ho usato la classe Socket per implementare il client sul PC. Sono riuscito a configurare il tutto per la connessione tra pc e plc (che funziona regolarmente). Inoltre il server (PLC) scrive regolarmente i dati sul socket (di questo sono sicuro). Il problema è che non riesco ad andare a recuperare i dati. Ho usato il seguente codice:

    codice:
     public String LeggiDati(Socket s1){
         String dati="";
    
              InputStream is = s1.getInputStream();
              BufferedReader dis = new BufferedReader(
              new InputStreamReader(is));
              dati= dis.readLine();
              dis.close();
          return dati;
         }
    ma non ottengo risultati. I dati scritti sul socket dal plc sono costituiti da una stringa di circa un centinaio di byte, ognuno dei quali contiene il codice ascii di un carattere.


    E' giusto quel codice per leggere i dati? quale può essere il problema?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: lettura di dati da un socket

    Originariamente inviato da italo2008
    ma non ottengo risultati. I dati scritti sul socket dal plc sono costituiti da una stringa di circa un centinaio di byte, ognuno dei quali contiene il codice ascii di un carattere.
    Ma la questione è solo quella che dovresti precisare bene quale è il "protocollo" di comunicazione. Nel senso: dire che i dati sono costituiti da una "stringa" di circa un centinaio di byte .... beh, dice poco, o perlomeno non dice tutto.

    Il numero di tali caratteri è sempre fisso? Se non è fisso, da cosa lo deduci? Perché viene inviato prima un header che indica il numero di caratteri? O perché alla fine della stringa c'è uno o più caratteri particolari (es. carriage-return)?
    E viene inviata una sola stringa? Più stringhe? Allo stesso modo??

    Insomma, hai capito: quale è l'esatto "protocollo" di comunicazione?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    allora... questo è quello che so:

    nel programma utente del PLC, i dati da inviare al client stanno su un buffer di 82 byte. Di questi 82 byte, io ne uso un certo numero per scriverci una stringa qualsiasi. Gli altri byte del buffer rimangono a 0. Io posso anche decidere quanti byte scrivere sul socket (ho impostato che li scriva tutti e 82).Questi byte verranno scritti sul socket una sola volta. Non so se oltre a questi, lui ne scrive altri.

    Una volta che si è stabilita la connessione, setto manualmente un byte nel programma utente del PLC ("abilita scrittura dati"). Fatto questo, quello che so è i dati vengono scritti sul socket (lo so perchè usando un'altra applicazione che legge i dati dal socket, una volta sganciato il byte mi trovo automaticamente la famosa stringa scritta in una area di testo, senza fare nulla).

    Un'altra cosa che ho notato: questo è il codice del metodo che legge i dati:

    codice:
    public String LeggiDati(Socket s1){
         String dati="";
         System.out.println ("ora eseguo il metodo LeggiDati");
    try{
              InputStream is = s1.getInputStream();
              BufferedReader dis = new BufferedReader(
              new InputStreamReader(is));
    
    
                System.out.println ("i dati ricevuti dal server sono: "+dis.readLine());
              dis.close();
              s1.close();
         }
    
         catch(IOException ex){
         System.out.println ("Errore nella lettura dei dati");
         }
          return dati;
         }
    quando lancio l'applicazione da netbeans, nella console mi scrive "ora eseguo il metodo LeggiDati" , ma non mi scrive "i dati ricevuti dal server sono...";

    per cui si pianta in una di queste 3 righe:

    codice:
              InputStream is = s1.getInputStream();
              BufferedReader dis = new BufferedReader(
              new InputStreamReader(is));
    più di questo, purtroppo, non so.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da italo2008
    quando lancio l'applicazione da netbeans, nella console mi scrive "ora eseguo il metodo LeggiDati" , ma non mi scrive "i dati ricevuti dal server sono...";
    La questione è così. Tu hai usato readLine(). Questo metodo legge una "riga". Riga intesa come una sequenza di caratteri terminata da un CR oppure LF oppure CR+LF. La tua stringa ha queste caratteristiche??? Deduco di no.

    Il tuo stream di dati è più particolare ... è basato su un'altra "convenzione". Tu dici "stanno su un buffer di 82 byte" e poi "io ne uso un certo numero per scriverci una stringa qualsiasi. Gli altri byte del buffer rimangono a 0".

    Questo vuole dire: [ N byte con caratteri ASCII ] [ restanti byte 0x00 fino a riempire 82 byte ]

    A meno che nella parte iniziale ci sia una sequenza di newline (come detto sopra), questa non è una "riga" di testo come intesa da readLine()!!!

    La logica quindi è diversa: bisogna fare una lettura che si aspetti 82 byte, cercare il primo byte nullo 0x00 (=fine stringa), trovata la fine ottenere una stringa con solo quei N caratteri iniziali.

    Tutto questo si può fare in diversi modi con diversi approcci. Una soluzione è:

    codice:
    InputStream is = s1.getInputStream();
    byte[] buf = new byte[82];
    int len = is.read(buf);
    if (len > 0) {
        String str = new String(buf, 0, len, "US-ASCII").trim();
    }
    Vengono letti al massimo 82 byte (la lunghezza letta effettivamente è nel 'len') e viene creato un String con i byte dal buffer, specificando il charset US-ASCII (almeno si è sicuri 1 byte->1 char!). Il trim() elimina dall'inizio/fine della stringa qualunque "whitespace" (caratteri nulli compresi).

    E hai la tua stringa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    funziona, grazie 10000000....

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.