我在客户端的Java代码库上执行Maven构建,其中一个测试套件失败。日志中报告的错误与我在使用NetBeans调试器执行代码时发现的错误相同。Java:DatagramSocket.send()失败,发生“BindException:无法分配请求的地址”0.0.0.0
原生函数java.net.PlainDatagramSocketImpl.send()
正在抛出一个BindException
- “无法分配请求的地址”。我不能更深入地介绍代码,因为它是本地函数。
在更高层次上,代码正在执行网络的基本测试。
DatagramSocket ds = new DatagramSocket(service.getNetworkConfiguration().getBindSocketAddress().getPort() + 100);
InetSocketAddress bindSocketAddress = service.getNetworkConfiguration().getBindSocketAddress();
ds.send(new DatagramPacket(message, message.length, bindSocketAddress.getAddress(), bindSocketAddress.getPort()));
的IP地址由service
返回,因此包含在bindSocketAddress
是,如前所述,0.0.0.0 - 我已经尝试了不同的端口(32168,22332,1234),都具有相同的错误。
出现在DatagramSocket
端口定义中的+ 100
显然是故意的,这个测试套件已经为其他人取得了很长时间的成功,并且已经有了这个功能。
我在Windows 7,64位上运行。
我已经禁用了本地计算机上的防火墙和防病毒软件,并且我运行了netstat -a
,但在绑定端口列表中看不到任何端口。
这可能是我的Windows配置甚至我的路由器的问题?也许我的Java配置在某种程度上?任何建议将不胜感激。
后续操作:我在CentOS 5.5虚拟机上运行时收到IDENTICAL错误。但是,由于VM guest虚拟机正在Windows 7主机上运行,因此它仍然可能是Windows 7的配置问题 - 共享其Internet连接。 (桥接)
后续#2(见第4条评论):RECIPIENT似乎无效为0.0.0.0
;实际上,JDK(InetAddress.java)中的一条评论说:未指定地址(也称为匿名地址或通配符地址)不得用作通配符地址为0.0.0.0的IP数据包的目标地址。我将代码更改为使用“localhost”(请参阅第4条评论)并解决了问题。但是,上述代码可能因我不明白的原因而有效;当我向代码开发人员澄清时,我会发布后续或答案。
更新(2012年3月1日):事实证明(事实上,有问题的代码只是前面程序员部分的一个错误)。我真正的误解与问题的主题完全无关。
解释是:每次构建Java代码时,我都会运行内置于系统中的关联单元测试。那时我没有意识到可以构建源代码,但是可以绕过单元测试。事实证明,团队中的另一位程序员已经构建了代码(成功),但跳过了单元测试(并没有注意到这个错误)。然后将代码提交给源代码控制,并相信它是正确的。其他程序员也习惯于在跳过单元测试的同时编写代码。因此,这个错误在几个星期内没有被发现。然而,我做了执行单元测试,并收到源代码管理这个假设的工作代码,但它仍然包含错误。我没有向团队中的其他人询问有关错误的信息,因为那时我相信我有责任充分理解Java而不需要花时间在团队中的其他程序员,我认为这是我的误解,因为我认为其他人是没有收到单元测试中的错误。
你似乎使用bindSocketAddress作为你想要发送数据包的主机,这是故意的吗? – nos 2011-04-25 16:37:17
@nos - 是的。 (这是我试图构建和运行的代码库,为了移过这个错误 - 我没有写 - 但是,这正是发生的情况,正如我从调试器中看到的那样,其中'java .net.PlainDatagramSocketImpl.send()'失败。) – 2011-04-25 16:42:49
那么这是一个逻辑错误 - 你需要弄清楚为什么谁写这个想要发送消息到bindSocketAddress。尽管将绑定地址配置为0.0.0.0是有意义的,因此您的套接字绑定到具有IP地址的所有接口,但尝试将数据包发送到0.0.0.0是没有意义的。也许你应该将绑定地址设置为一个真实的本地IP地址,所以你可以发送数据包给自己? – nos 2011-04-25 21:05:28