背景:我正在编写一个简单的UDP应用程序,每分钟向我管理的测试服务器发送ping请求,以告诉我它仍然在运行(对于那些想知道的人,我无法在服务器上启用ping)。我计划在手机上运行此应用程序,以在服务器不再响应时警告我。
我试图使用看似简单的java.net.DatagramSocket来实现这一点:
让我也说一句,我已经通过Android清单启用了Internet权限,如果我删除使用语句,则会出现权限错误,所以我确定这样做是可以的。当我将此代码下载到Android虚拟设备(AVD)并执行它时,在调用bind()时会弹出以下异常:
03-17 19:07:39.401:INFO/System.out(338):java.net.BindException:Invalid argument。
根据此文档,空参数是正确的:
链接
引用如下:
当我逐步执行代码时,它运行得很好,我可以在AVD上看到两个IP地址,但是在bind()调用上我仍然会遇到完全相同的异常。有没有人能看出我可能错过了什么?我将继续研究并希望发布解决自己问题的方案,但我希望有人能为我提供捷径。
我试图使用看似简单的java.net.DatagramSocket来实现这一点:
try
{
socket = new DatagramSocket();
socket.bind(null);
}
catch (SocketException e)
{
System.out.println(e.toString());
throw e;
}
让我也说一句,我已经通过Android清单启用了Internet权限,如果我删除使用语句,则会出现权限错误,所以我确定这样做是可以的。当我将此代码下载到Android虚拟设备(AVD)并执行它时,在调用bind()时会弹出以下异常:
03-17 19:07:39.401:INFO/System.out(338):java.net.BindException:Invalid argument。
根据此文档,空参数是正确的:
链接
引用如下:
但是,不信任文档,我决定像这样枚举我的设备上的IP地址:
public void bind(SocketAddress localAddr)
自API级别1开始
将此套接字绑定到localAddr指定的本地地址和端口。如果该值为null,则使用有效本地地址上的任何空闲端口。
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()调用上我仍然会遇到完全相同的异常。有没有人能看出我可能错过了什么?我将继续研究并希望发布解决自己问题的方案,但我希望有人能为我提供捷径。