2017-02-03 8 views
0

UDPパケットを受信して​​データをファイルに保存する小さなプログラムを作成しました。私はそれが次のコードを使用読みしようとしていますその後UDPパケットの長さが正しく書かれていない

 MulticastSocket socket = getMulticastSocket(interfaceAddress, multicastAddress, port); 
     FileOutputStream fos = null; 
     try{ 
      fos = new FileOutputStream(fileName); 
      while(true) { 
       byte[] data = new byte[BUFFER_SIZE]; 
       byte[] lengthBytes = new byte[4]; 
       DatagramPacket packet = new DatagramPacket(data, 0, data.length); 
       socket.receive(packet); 
       int length = packet.getLength(); 
       ByteBuffer lengthBB = ByteBuffer.wrap(lengthBytes); 
       lengthBB.putInt(length); 
       fos.write(lengthBB.array()); 
       fos.flush(); 
       fos.write(data, 0, length); 
       fos.flush(); 
      } 
     } 

final FileInputStream inputStream = new FileInputStream(fileName); 
byte[] length = new byte[4]; 
while (inputStream.read(length) != -1){ 
    int receivedLength = ByteBuffer.wrap(length).getInt(); 
    byte[] body = new byte[receivedLength]; 
    inputStream.read(body); 
    // doing something with body 
    length = new byte[4]; 
} 

それは一般的に動作しますが、ファイルの途中で、私はreceivedLength変数に負の値を持っている(-2147483648と[-128 、0、0、0])である。

BUFFER_SIZE = 10240しかし、私はこのパッケージがこの値よりも大きいとは思わない。

質問:なぜ起こったのですか?

p.s.ファイルが書き込まれたマシンへのアクセス権がなく、ネットワークストリームを見ることができません。私はファイルしか持っていません。

+0

'read()'がバッファをいっぱいにしているとします。あなたは 'DataInputStream.readFully()'を使用していなければなりません。そして 'DataInpitStream.readInt()'。 – EJP

+0

@EJP DataInputStreamを使用しようとしましたが、同じ結果が得られます。私は私の作家にいくつかの問題があると思います。残念ながら、私は問題が何であるか理解していません – ViKo

答えて

0

UDPメッセージの最大サイズは64Kです。あなたは、パケットが10240よりも大きかったとは思わないと言いましたが、そうかもしれません。バッファを64 * 1024に増やして、結果が変わるかどうか確認してください。

+0

なぜ私は負の価値を持っていることを説明できますか?私はそれをテストし、バッファよりも大きいパケットを送信しようとしましたが、getLengthメソッドは私のバッファ(10240)のサイズを返しました – ViKo

+0

バッファに少し大きすぎる数値をあまりにも大きくしようとすると、小さすぎる。しかし、あなたのバッファーが少し小さすぎて、左端のビットが1で終わると、それは負の数として表示されます。 –

関連する問題