![](/img/trans.png)
[英]NIO: How to avoid socketChannel.read(buffer) if no data available in buffer
[英]when socketChannel.read(BUFFER) will return 0
我有一個從SocketChannel
讀取的服務器,如下所示:
private void readDataFromSocket(SocketChannel socketChannel) throws IOException {
BUFFER.clear();
int count = 0;
while ((count = socketChannel.read(BUFFER)) > 0) {
BUFFER.flip();
int limit = BUFFER.limit();
while (limit > 0) {
System.out.print((char) BUFFER.get());
limit--;
}
}
if (count < 0) {
System.out.println("closing the socket!!!");
socketChannel.close();
}
}
下面是客戶端向SocketChannel
寫入的客戶端:
private void write(String str, SocketChannel channel) throws IOException{
byte[] b = str.getBytes();
buffer.clear();
buffer.put(b);
buffer.flip();
while(buffer.hasRemaining()){
channel.write(buffer);
}
}
所以我的問題是:
count
數值將為0( while ((count = socketChannel.read(BUFFER)) > 0)
)? count
將為0,即假設客戶端編寫了: stack overflow
,讀取stack
之后,服務器的count
為0,即消息的一半,該count
是否為0?客戶端已發送(認為郵件可以為1MB大小)? 使用阻止模式時,您將始終獲得至少1個字節。 注意:您可能只會得到1個字節,而不會讀取“消息”。
當使用非阻塞模式時,實際上大多數時候沒有數據包等待您時,您將獲得0。
在TCP中,數據以數據包而不是消息的形式發送。 這意味着,如果您發送1 MB,則很有可能會將其分解為MTU大小的數據包,例如〜1500字節。 如果您讀取此套接字,則很可能會看到此大小的塊,如果自上次讀取以來有多個數據包進入,則可能會看到多個塊。 除非您讀取的數據少於可用數據,否則您將永遠看不到數據包的一部分。 例如,如果正在等待1500個字節,而您僅讀取8個字節,則將獲得該數據包的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.