繁体   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