簡體   English   中英

當socketChannel.read(BUFFER)將返回0時

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

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