2016-04-04 5 views
0

ich den Code unten bin mit einem Unix-Socket zu lesen:Griff spezifische Byte aus der Steckdose in Java

Boolean flag = false; 
    while (!flag) { 
     try { 
      File socketFile = new File("./RISP"); 
      AFUNIXSocket sock = AFUNIXSocket.newInstance(); 
      sock.connect(new AFUNIXSocketAddress(socketFile)); 
      System.out.println("!!!!!!!!!!CONNECTED!!!!!!!!!"); 
      flag = true; 
      BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      String line = null; 
      while ((line = input.readLine())!=null) { 
       System.out.println(line); 
      } 
     } catch (IOException e) { 
      System.out.println("NOT CONNECTED....." + e); 
     } 

     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException inter) { 
      System.out.println(inter); 
     } 
    } 

Ich brauche die ersten 4 Bytes jedes Pakets zu lesen und wandeln sie von binär in Integer.

Ich habe viele Beiträge gelesen, aber ich bin immer noch auf der Suche nach der besten Lösung für mein Problem.

Antwort

1

Reader und Writer sind für das Lesen von Text ausgelegt.

Für binäre, sollten Sie versuchen, InputStream und OutputStream, in diesem Fall möchten Sie DataInputStream möglicherweise gepuffert.

DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 

int len = in.readInt(); // read big-endian. 
if (LITTLE_ENDIAN) 
    len = Integer.reverseBytes(len); 
byte[] bytes = new byte[len]; 
in.readFully(bytes); 
+0

@Aaron danke für den Schnitt. –

+1

Also in diesem Fall wird Byte [] das ganze Paket erhalten enthalten? –

+0

ich habe versucht, die DataInputStream-Methode zu verwenden, aber ich habe "Ausnahme im Thread" main "java.lang.OutOfMemoryError: Java-Heap-Space" Ausnahme bei Zeile Byte [] Bytes = neues Byte [len]; –

0

scheint es

DataInputStream in = new DataInputStream(new BufferedInputStream(sock.getInputStream())); 
       int len = -1; 
       while ((len = in.readInt()) != -1) { 
        len = Integer.reverseBytes(len); 
        byte[] bytes = new byte[len]; 
        in.readFully(bytes); 
        if (bytes.length > 4) { 
         System.out.println(" BYTE0: " + bytes[0] + 
              " BYTE1: " + bytes[1] + 
              " BYTE2: " + bytes[2] + 
              " BYTE2: " + bytes[3] + 
              " LENGHT: " + bytes.length); 
        } 
       } 

funktioniert lass es mich wissen, ist, ich etwas vermissen. vielen Dank an euch.

+0

wie ich schon sagte, habe ich ein Problem, die ersten 4 Byte konvertiert in Ganzzahl sollte die Größe des Pakets geben. aber das Ergebnis stimmt nicht mit bytes.length überein. Ich brauche die Größe, um das nächste n = Größenbyte der Nachricht zu erhalten, und mache das solange, bis die Verbindung geschlossen ist. –

+0

Dies ist, was ich in meiner Antwort notierte, Anmerkung 'readInt()' und 'readFully()' wird eine EOFException werfen wenn du das Ende des Stromes erreichst. –

+0

@PeterLawrey erstens vielen dank für ihre geduld, ich verstehe nur nicht eine sache, wenn ich bytes.lenge drucke es gibt die richtige größe zurück, aber die größe sollte die gleiche sein, die ich aus den ersten 4 byte berechnen. die ersten 4 Bytes, die ich erhalte, sind BBB0: 0, BBB1: 0, BBB2: 244, BBB3: 1, also sieht das Paket aus wie 244 * 256 + 1 Bytes. –