3

実際のデータが続くバイト長で指定された TCP ストリームから文字列を読み取りたいと思います。Pythonでは、私はそうします

length = ord(stream.read(1))
data = stream.read(length)

Java NIO で同じことを行うにはどうすればよいですか? 私が持っているのはバッファです(容量257)

stream.read(buffer); // cannot specify a size here
int length = buffer.get();
byte[] data = new byte[length];
buffer.get(data);

残念ながら、これは機能しません: get() 呼び出しはバッファ内のデータを読み飛ばします:-(

おそらく、フリップ、巻き戻し、リセットなどの組み合わせが必要ですが、わかりません。

4

2 に答える 2

5

streamが で が のSocketChannel場合buffer、次ByteBufferのことができます。

//assuming buffer is a ByteBuffer
buffer.position(0);
buffer.limit(1);
while (buffer.hasRemaining()) { 
   stream.read(buffer);
}
buffer.rewind();

//get the byte and cast it into the range 0-255
int length = buffer.get() & 0xFF;
buffer.clear();
buffer.limit(length);
while (buffer.hasRemaining()) { 
   stream.read(buffer);
}
buffer.rewind();
//the buffer is now ready for reading the data from
于 2009-08-22T21:24:22.553 に答える
0

java.nio.channel.GatheringByteChannel と DatagramChannel を調べてみることをお勧めします。必要に応じてデータグラムを指定する必要があります。

これは、Python の例で行ったことです (最初のバイトはペイロードの長さを示し、この長さを使用してプレイロードを読み取ります)。

データグラムは、データ ストリームの仕様です。ストリームを論理的にパッケージに分割します。そのため、ペイロードの長さ (およびパッケージ サイズ) を示すペイロード パッケージを最初に送信することをお勧めします。編集: もちろん、ストリームの両側で同じプロトコル/データグラム言語を話す必要があります。

于 2009-08-22T21:16:29.450 に答える