Java SocketChannel如何知道读取文件何时完成?
我使用套接字通道和NIO概念从客户端读取数据。Java SocketChannel如何知道读取文件何时完成?,java,sockets,nio,Java,Sockets,Nio,我使用套接字通道和NIO概念从客户端读取数据。 套接字通道如何知道读取文件何时完成 ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE); int nbytes = socketChannel.getChannel().read(byteBuffer); 如果数据很小,我会一次读取所有数据,但是如果数据很大,我会以片段的形式读取数据,最后得到相同的数据。现在我想知道如何理解数据末尾的通道。 有没有办法让我知道文件读取何时完成?有三个基本选项:
套接字通道如何知道读取文件何时完成
ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);
如果数据很小,我会一次读取所有数据,但是如果数据很大,我会以片段的形式读取数据,最后得到相同的数据。现在我想知道如何理解数据末尾的通道。有没有办法让我知道文件读取何时完成?有三个基本选项:
ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);
- 协议可以指定文件的长度应在数据之前
- 协议可以指定一些“文件结束”标记(当然,这对于文件中的数据是无效的)
- 服务器可以在完成后关闭套接字:您的
调用将返回-1,告知您何时读取了所有数据read
您使用的是什么协议,您可以适当地修改它吗?长度前缀通常是最简单的解决方案。有三个基本选项:
- 协议可以指定文件的长度应在数据之前
- 协议可以指定一些“文件结束”标记(当然,这对于文件中的数据是无效的)
- 服务器可以在完成后关闭套接字:您的
调用将返回-1,告知您何时读取了所有数据read
您使用的是什么协议,您可以适当地修改它吗?长度前缀通常是最简单的解决方案。请参阅此NIOClient示例,它等待特定于应用程序的“>>”终止符提示字符。它是数据包标记的结尾。您可以实现类似的方法,或者每个数据包的开头都有4字节的长度值。请参阅此NIOClient示例,它等待特定于应用程序的“>>”终止符提示字符。它是数据包标记的结尾。您可以实现类似的方法,或者每个数据包的开头都有4字节的长度值。