背景:我正在编写一个简单的 UDP 应用程序来 ping 一个测试版服务器,我每分钟左右管理一次,告诉我它仍在运行(对于那些想知道的人,我无法在服务器上启用 ping)。我计划在手机上运行此命令,以便在服务器不再响应时向我发出警告。
我正在尝试使用看似简单的 java.net.DatagramSocket :
try
{
socket = new DatagramSocket();
socket.bind(null);
}
catch (SocketException e)
{
System.out.println(e.toString());
throw e;
}
我还想说,我已经通过 android 清单启用了互联网权限,如果我删除使用子句来执行此操作,我会收到权限错误,所以我确信它工作正常。当我将此代码下载到 Android 虚拟设备 (AVD) 并执行它时,在调用 bind() 时,我遇到了以下异常:
03-17 19:07:39.401: INFO/System.out(338): java.net.BindException: 参数无效
根据this文档中,空参数是正确的:
公共无效绑定(SocketAddress localAddr)
自:API 级别 1
将此套接字绑定到 localAddr 指定的本地地址和端口。如果该值为空,则使用有效本地地址上的任何空闲端口.
但由于不信任文档,我决定枚举设备上的 IP 地址,如下所示:
ArrayList<NetworkInterface> allInterfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
NetworkInterface eth = allInterfaces.get(0);
InetSocketAddress addr = new InetSocketAddress(eth.getInetAddresses().nextElement(), port);
try
{
socket = new DatagramSocket();
socket.bind(addr);
}
catch (SocketException e)
{
System.out.println(e.toString());
throw e;
}
当我单步执行代码时,它工作得很好,我可以看到 AVD 上的两个 IP 地址,但我在 bind() 调用上得到了完全相同的异常。有人看到我可能会错过什么吗?我将继续研究并希望发布解决我自己问题的方法,但我希望有人能够为我解决这个问题。