[英]Java SocketChannel : Why wrap-flip-write doesn't work but wrap-write does?
假设我们有一个Java SocketChannel
连接到等待传入数据的服务器:
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);
为什么是这样 ?!
我自己想出了这个问题,所以我在StackOverflow
上写StackOverflow
来分享信息,并对面临同样问题的其他人有用。
根据ByteBuffer.wrap()
的java-doc :
新缓冲区的容量和限制将是
array.length
,它的位置将为零,其标记将是未定义的。
而Buffer.flip()
的java-doc说:
翻转此缓冲区。 限制设置为当前位置,然后位置设置为零。 如果定义了标记,则将其丢弃。
现在答案是明确的: wrap()
将缓冲区的位置设置为零,而flip()
将缓冲区的限制设置为当前位置(为零),而write(buffer)
将从位置开始到限制,这两个都是0
,因此它什么都没写!
wrap()提供已经翻转的缓冲区。 再次翻转它基本上会从write()或get()的角度清空它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.