[英]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.