2

假设我们有一个 JavaSocketChannel连接到正在等待传入数据的服务器:

SocketChannel server = SocketChannel.open();
server.connect(new InetSocketAddress(ip, port));

我们发送我们的请求如下:

byte[] request = "This is a request for server!".getBytes();
ByteBuffer buffer = ByteBuffer.wrap(request);
buffer.flip();
int write = 0;
while (buffer.hasRemaining())
    write += server.write(buffer);
System.out.println(write);

上面的代码返回0,这意味着它不会向通道写入任何字节!

但是,如果我删除该buffer.flip()行,它将正常工作并发送数据:

byte[] request = "This is a request for server!".getBytes();
ByteBuffer buffer = ByteBuffer.wrap(request);
int write = 0;
while (buffer.hasRemaining())
    write += server.write(buffer);
System.out.println(write);

为什么是这样 ?!

4

2 回答 2

5

我自己发现了这个问题,所以我在这里写它是StackOverflow为了分享信息并对面临同样问题的其他人有用。

根据java-ByteBuffer.wrap() doc :

新缓冲区的容量和限制将为array.length,其位置为零,其标记为未定义。

java-doc for说Buffer.flip()

翻转此缓冲区。限制设置为当前位置,然后位置设置为零。如果标记已定义,则将其丢弃。

答案现在很清楚:wrap()将缓冲区的位置设置为零,并将flip()缓冲区的限制设置为当前位置(为零),并且write(buffer)将从位置开始到限制两者都是0,因此它什么也不写!

于 2013-10-01T13:27:13.067 回答
0

wrap() 提供一个已经翻转的缓冲区。从 write() 或 get() 的角度来看,再次翻转它基本上会清空它。

于 2013-10-01T22:50:36.657 回答