Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Socketchannel - Fatal编程技术网

Java 如何获取SocketChannel接收的数据大小

Java 如何获取SocketChannel接收的数据大小,java,socketchannel,Java,Socketchannel,我正在为我的应用程序编写一个服务器,它必须从客户端获取数据并执行smth。通信是使用SocketChannel完成的,但存在一个问题:我只能从中读取以前指定数量的字节(从channel.read的javadoc开始)(ByteBuffer dst)) 尝试从通道读取最多r个字节,其中r是缓冲区中剩余的字节数 有没有办法获取通道中当前数据的大小,并将其全部读取到字节[]?我认为没有。你必须自己处理这件事。您是使用序列化对象还是创建了自己的协议 有一个问题:我只能从中读取以前指定的字节数 那是不对的

我正在为我的应用程序编写一个服务器,它必须从客户端获取数据并执行smth。通信是使用
SocketChannel
完成的,但存在一个问题:我只能从中读取以前指定数量的字节(从
channel.read的javadoc开始)(ByteBuffer dst)

尝试从通道读取最多r个字节,其中r是缓冲区中剩余的字节数


有没有办法获取通道中当前数据的大小,并将其全部读取到
字节[]

我认为没有。你必须自己处理这件事。您是使用序列化对象还是创建了自己的协议

有一个问题:我只能从中读取以前指定的字节数

那是不对的

(自javadoc for
channel.read(ByteBuffer dst)

尝试从通道读取最多r个字节,其中r是缓冲区中剩余的字节数

你错过了“最多”这个词。没问题。如果有一个字节可用,则将读取一个字节,而不管
ByteBuffer
中剩余的空间有多大

有没有办法获取通道中当前数据的大小,并将其全部读取到
字节[]


事实就是这样。“当前在通道中”的数据量“==在ByteBuffer>中剩余的空间中读取的数据量>=套接字接收缓冲区中的数据大小,这将是
read()

返回的值。您不能这样做。只需使用avarage缓冲区,并使用“read”返回的值就可以知道需要多少数据read@user996142这完全等同于执行您刚才所说的无法执行的操作。我正在发送一个对象,在默认情况下序列化为
byte[]
。我知道,我可以发送arrray大小,但可能有一种方法不能自己发送?看看我的博客,我在通过UDP发送序列化对象时必须这样做:你的博客包含许多错误,首先是一个奇怪的说法,即UDP缺少流是由于Java造成的,而代码忽略了
receive()
返回的长度,以及在不需要时加入多播组的发送方。没有任何东西可以回答这个问题。你误解了这一点。这是由于协议,而不是Java。也许我应该更清楚地解释这一点。:)我没有误解什么。我知道这是怎么回事。所以我才知道这是个错误。当您声明“在Java中,关于UDP的使用有一个小问题…”你说错话了。当然,您需要更清楚地表达它。我没有漏掉这句话,但通过这种方式,我应该创建一个具有
Integer.MAX_VALUE
容量的缓冲区,如果我想要100%读取通道中的所有数据,这不是一个好主意。但我已经通过发送前4个字节的数据大小来完成了,所以你的问题表达得不正确“通道中当前的所有数据”只能表示“套接字接收缓冲区中当前的所有数据”。如果您的意思是“所有将通过通道发送的数据”,那么它当然可能是无限的。