DatagramSocket.bind(); Socket异常:无法分配请求的地址。Android模拟器

4
我是新手,对于Android和Java都不太了解,如果我的问题在不适当的组或论坛中提出,请原谅。我为我的公司制作了一个.Net应用程序,最近他们要求我将其移植到Android上,以便安装在三星Galaxy Tab上。
首先,我使用的是Eclipse、JDK 6、目标平台为Android 2.2,以及带有GalaxyTab插件的模拟器。我的操作系统是Windows 7。
这个应用程序通过UDP发送和接收来自网络上某个控制器的消息。简单来说,我的应用程序使用“DatagramSocket”将其绑定到本地“InetSocketAddress”,然后启动一个线程来监听数据报,而另一个线程则在用户请求时向控制器发送请求。以下是一些代码片段:
这是我分配本地地址和套接字的地方:
try {
     loc_addr = new InetSocketAddress(
       Inet4Address.getByAddress(
              new byte[]{(byte) 192,(byte) 168,1,(byte)240}), 0xBAC0); 
       //192.168.1.240 is the IP of my machine on the network
} catch (UnknownHostException e) {
     .......
}
try {
     soc = new DatagramSocket();
     soc.setReuseAddress(true);
     soc.setBroadcast(true);
     soc.bind(loc_addr);
} catch (SocketException e) {
     .......
}

这是我监听传入数据报的地方:
try{
     buf = new byte[1024];
     receive_pac = new DatagramPacket(buf, 1024);
     soc.receive(receive_pac);
     if (receive_pac.getData() != null){
     .......
     }
}

这是我发送数据的位置:
try {
    addr = (Inet4Address) Inet4Address.getByAddress (new byte[]
{(byte) 192,(byte) 168,1,(byte) 255}); //The message I am sending should be broadcasted
} catch (UnknownHostException e) {
    ......
}
sendPacket = new DatagramPacket(buf, buf.length, addr,
loc_addr.getPort());
try {
    soc.send(sendPacket);
} catch (IOException e) {
    ......
}

当我使用“soc.bind(...)”时,我会收到以下异常:

无法分配请求地址

然后我会收到一个调试信息(我不知道它是否相关):

DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol

应用程序正在工作,我通过“WireShark”验证了当我要求从模拟器将数据发送到控制器时,控制器正确地回复了预期的数据。然而,在应用程序中,模拟器上的套接字没有接收到任何内容,并且在“接收”调用上保持阻塞状态!
有人能帮我找出我在应用程序接收部分犯了什么问题或错误吗?
非常感谢任何帮助。
2个回答

8

TMI,

[编辑:如果您看到我的另一个答案,请忽略它,我犯了一个错误,改变了两个变量,结果是另一个变量导致了差异。]

关于这个:

我尝试将其绑定到套接字,结果出现“SocketException:Invalid Argument”。但是程序仍然提供相同的操作!你有什么想法吗?

您可能已经解决了这个问题,但我也有同样的问题,并且在 这里 找到了答案。

对我来说,摆脱这个异常的方法是更改创建 DatagramSocket 的方式。

从:

sock = new DatagramSocket();

收件人:

DatagramChannel channel = DatagramChannel.open();
DatagramSocket socket = channel.socket();

非常感谢你,你救了我 :-)。不过我发现使用 InetAddress.getByAddress("192.168.1.240"); 更容易些。 - Andy
我还回答了你提到的问题(现在遇到了这个问题); 基本上正确的解决方案是通过DatagramSocket(SocketAddress localAddr)构造函数创建一个未绑定的套接字,只需将null作为参数传递即可。有关详细信息,请参见您引用的问题中的我的答案。 - Newtron

0
通常情况下,如果您尝试绑定到您不拥有的IP地址,则会看到该错误消息。您确定您的Android模拟器的IP地址是192.168.1.240吗?模拟器IP可能与主机机器IP不同。

1
谢谢Jeff的帮助和信息。 我搜索了一下,在链接http://www.droidnova.com/get-the-ip-address-of-your-device,304.html上找到了一些代码,它让我能够找到模拟器的IP地址,正如你所说,这与我的PC的IP地址相当不同。 我尝试将其绑定到套接字上,结果出现了“SocketException: Invalid Argument”。但程序仍然执行了相同的操作!你有任何想法这个异常可能是什么意思吗? - TMI
@TMI 不太确定这次可能是什么问题。但看起来你不是唯一一个遇到这个问题的人 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接