2016-04-04 8 views
0

にソケットから特定のバイトをハンドル:私は、各パックの最初の4つのバイトを読み込み、整数へのバイナリからそれらを変換する必要があり私はUnixソケットを読み取るために以下のコードを使用していた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); 
     } 
    } 

私は多くの投稿を読んだことがありますが、私はまだ私の問題に最適な解決策を探しています。

答えて

1

リーダーとライターはテキストを読むために設計されています。

バイナリの場合は、InputStreamとOutputStreamを試す必要があります。この場合、DataInputStreamをバッファリングする必要があります。

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編集していただきありがとうございます。 –

+1

この場合、byte []に​​はパック全体が入っていますか? –

+0

私はDataInputStreamメソッドを使用しようとしましたが、 "スレッドで例外"が発生しました。メイン "java.lang.OutOfMemoryError:Javaヒープスペース"例外は行のバイト[]バイト=新しいバイト[len]; –

0

は、それは私が何かを見逃している私に知らせてください

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); 
        } 
       } 

働くようです。 よろしくお願いします。

+0

私が前に言ったように、私はいくつかの問題を抱えています、整数に変換された最初の4バイトはパケットのサイズを与えるべきです。結果はbytes.lengthと一致しません。私は、メッセージの次のn = sizeバイトを取得するためにサイズが必要で、接続が閉じるまでこれを続けます。 –

+0

これは私の答えで述べたものです。 'readInt()'と 'readFully()'はEOFExceptionをスローしますあなたがストリームの終わりに達したとき。 –

+0

@PeterLawreyまず、あなたの忍耐のおかげで、私はちょうど1つの事を理解していません。私はbytes.lengthを返します。サイズは正しいですが、サイズは最初の4バイトから計算したものと同じでなければなりません。私が受け取る最初の4バイトはBBB0:0、BBB1:0、BBB2:244、BBB3:1なので、パケットは244 * 256 + 1バイトのように見える。 –