Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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 接收数据包_Java_Udp_Datagram - Fatal编程技术网

Java 接收数据包

Java 接收数据包,java,udp,datagram,Java,Udp,Datagram,在DatagramPacket类中,所有构造函数都需要一个int参数作为“length”。 既然我不一定知道数据包的长度,为什么我在尝试接收数据包时需要设置数据包的长度? 我应该把它定在哪个号码 编辑: 让我把问题改为: 如果DatagramSocket.receive方法具有签名 public DatagramPacket receive() {}; 而不是 public void receive(Datagrampacket p) {}; 这不是更有意义吗?既然如此,接收者通常不知道数据

DatagramPacket
类中,所有构造函数都需要一个int参数作为“length”。 既然我不一定知道数据包的长度,为什么我在尝试接收数据包时需要设置数据包的长度? 我应该把它定在哪个号码

编辑: 让我把问题改为:

如果
DatagramSocket.receive
方法具有签名

public DatagramPacket receive() {};
而不是

public void receive(Datagrampacket p) {};
这不是更有意义吗?既然如此,接收者通常不知道数据包是什么样子

由于传递服务类比通常应用于UDP,因此我们假设:


DatagramSocket就像一个邮箱。DatagramPacket就像包裹信封。DatagramPacket.data是信封内的内容。对于投递服务,接收者提供邮箱,但不提供信封。

好吧,您要求它写入您也提供的字节数组。因此,请确保您的字节数组与您希望处理的最大数据包一样大,并为
length
参数传入数组的长度

编辑:对于已编辑的问题,该API意味着接收代码每次都必须创建一个新的缓冲区。在现有的API中,相同的字节数组可以用于多个调用,因为调用方可以决定何时使用完它

现在必须承认,像这样的过载是有道理的:

public DatagramPacket(byte[] buffer)
{
    this(buffer, buffer.length);
}

。。。但那是另一回事。

好吧,你要求它写入你也提供的字节数组。因此,请确保您的字节数组与您希望处理的最大数据包一样大,并为
length
参数传入数组的长度

编辑:对于已编辑的问题,该API意味着接收代码每次都必须创建一个新的缓冲区。在现有的API中,相同的字节数组可以用于多个调用,因为调用方可以决定何时使用完它

现在必须承认,像这样的过载是有道理的:

public DatagramPacket(byte[] buffer)
{
    this(buffer, buffer.length);
}

。。。但那是另一回事。

事实上这就是问题所在。为什么要在java程序中提供数组的长度?这是Occam的KISS原则吗?@Val:它允许您对所有读取重复使用相同的缓冲区,这比接收代码每次创建一个新的字节数组更有效。当然,它也可能模仿本机接口……不。当您一次又一次地提供缓冲区时,它将被重用。提供长度并不能使它更易于重用。@Val:你误解了我的意思。客户端提供缓冲区的替代方案是什么?数据包可以创建自己的数据包,但不能重用它。如果客户端提供了缓冲区,则可以重用它。是的,通过使用
length
属性很容易出现重载,但至少能够限制写入的长度(和偏移量)是有意义的。这实际上就是问题所在。为什么要在java程序中提供数组的长度?这是Occam的KISS原则吗?@Val:它允许您对所有读取重复使用相同的缓冲区,这比接收代码每次创建一个新的字节数组更有效。当然,它也可能模仿本机接口……不。当您一次又一次地提供缓冲区时,它将被重用。提供长度并不能使它更易于重用。@Val:你误解了我的意思。客户端提供缓冲区的替代方案是什么?数据包可以创建自己的数据包,但不能重用它。如果客户端提供了缓冲区,则可以重用它。现在是的,可能很容易出现重载,仅通过使用
length
属性进行委托,但至少能够限制写入的长度(和偏移量)是有意义的。您的编辑会产生误导。该示例将问题“为什么我们需要在DatagramPackage中用datagram.length复制datagram.buffer.length?”替换为为什么我们首先需要提供缓冲区。这是两个不同的问题。而且,现在还不清楚你在问什么。你的编辑有误导性。该示例将问题“为什么我们需要在DatagramPackage中用datagram.length复制datagram.buffer.length?”替换为为什么我们首先需要提供缓冲区。这是两个不同的问题。而且,现在还不清楚你在问什么。