Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SocketChannel如何知道读取文件何时完成?_Java_Sockets_Nio - Fatal编程技术网

Java SocketChannel如何知道读取文件何时完成?

Java SocketChannel如何知道读取文件何时完成?,java,sockets,nio,Java,Sockets,Nio,我使用套接字通道和NIO概念从客户端读取数据。 套接字通道如何知道读取文件何时完成 ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE); int nbytes = socketChannel.getChannel().read(byteBuffer); 如果数据很小,我会一次读取所有数据,但是如果数据很大,我会以片段的形式读取数据,最后得到相同的数据。现在我想知道如何理解数据末尾的通道。 有没有办法让我知道文件读取何时完成?有三个基本选项:

我使用套接字通道和NIO概念从客户端读取数据。
套接字通道如何知道读取文件何时完成

ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);
如果数据很小,我会一次读取所有数据,但是如果数据很大,我会以片段的形式读取数据,最后得到相同的数据。现在我想知道如何理解数据末尾的通道。

有没有办法让我知道文件读取何时完成?

有三个基本选项:

ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);
  • 协议可以指定文件的长度应在数据之前
  • 协议可以指定一些“文件结束”标记(当然,这对于文件中的数据是无效的)
  • 服务器可以在完成后关闭套接字:您的
    read
    调用将返回-1,告知您何时读取了所有数据
基本上,数据是以流的方式传输的,您不能依赖于在特定数量的请求中发送的所有数据


您使用的是什么协议,您可以适当地修改它吗?长度前缀通常是最简单的解决方案。

有三个基本选项:

  • 协议可以指定文件的长度应在数据之前
  • 协议可以指定一些“文件结束”标记(当然,这对于文件中的数据是无效的)
  • 服务器可以在完成后关闭套接字:您的
    read
    调用将返回-1,告知您何时读取了所有数据
基本上,数据是以流的方式传输的,您不能依赖于在特定数量的请求中发送的所有数据


您使用的是什么协议,您可以适当地修改它吗?长度前缀通常是最简单的解决方案。

请参阅此NIOClient示例,它等待特定于应用程序的“>>”终止符提示字符。它是数据包标记的结尾。您可以实现类似的方法,或者每个数据包的开头都有4字节的长度值。请参阅此NIOClient示例,它等待特定于应用程序的“>>”终止符提示字符。它是数据包标记的结尾。您可以实现类似的方法,或者每个数据包的开头都有4字节的长度值。