当socketChannel.read(BUFFER)将返回0时

时间:2014-01-01 11:43:25

标签: java sockets socketchannel

我有一个服务器,可以从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,在读取count之后服务器stack中是否可能为0,即客户端发送的消息的一半(认为消息可以是1MB大小)?

1 个答案:

答案 0 :(得分:1)

使用阻止模式时,您将始终获得至少1个字节。注意:您可能只获得1个字节,但它不会读取“消息”。

当使用非阻塞模式时,大部分时间都会得到0,实际上只要没有数据包等你。

在TCP中,数据以数据包而不是消息发送。这意味着如果您发送1 MB,则很可能会将其分成您的MTU大小的数据包,例如: ~1500字节。如果您读取此套接字,您很可能会看到此大小的块或自上次读取后有多个数据包进入的多个块。除非您阅读的数据少于可用数据,否则您将永远不会看到数据包的一部分。例如如果1500个字节在等待并且您只读取8个字节,则会获得该数据包的一部分。