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是 aSocketChannel并且buffer是 a 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 回答