2012-07-11 66 views
0

我在寫一個非阻塞客戶端,它使用選擇器SelectionKey.OP_READselector.select()調用從網絡套接字讀取數據。閱讀部分是這樣處理的:Java NIO套接字IO退化讀取塊大小

if (selectionKey.isReadable()) { 
    int len = inChannel.read(buf); 
    System.out.println(len); 
    . . . 
} 

我看到的是,讀取大小(len)作爲下載逐漸退化問題的進展:

1290 
1290 
1290 
480 
318 
28 
28 
28 
28 
28 
28 
28 
28 
28 
28 
28 
28 
28 

有誰知道這是爲什麼,以及如何改善它?當然,它的工作原理是這樣,但我需要減少CPU開銷,因此最好處理大塊而不是小塊。增加一個小的睡眠(20ms)會有所幫助,但顯然會限制可擴展性,因爲我需要同時處理數千個數據流。

+0

我認爲你應該重新考慮你想要做的事情。非阻塞式讀取意味着「給我你現在有的數據,並儘快返回」。等待獲取更多數據的非阻塞讀取實際上是一個阻塞讀取,不是嗎?該過程在等待數據時應該做些什麼? – Flavio 2012-07-11 08:46:03

回答

0

要回答我的問題...

沒關係;我沒有正確使用緩衝區。從緩衝區讀取後忘記compact()調用。

if (selectionKey.isReadable()) { 
    int len = inChannel.read(buf); 
    System.out.println(len); 
    . . . 
    buf.flip(); 
    // ... read from buf ... 
    buf.compact(); 
} 

顯然緩衝區不是圓形的;即使緩衝區爲空,在下次使用之前,必須重置位置和限制。

+0

在得到任何東西之前,你必須「翻轉()」緩衝區,然後再壓縮()。 – EJP 2012-07-11 10:31:40