簡體   English   中英

Java SocketChannel:為什么wrap-flip-write不起作用但是wrap-write呢?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM