2011-03-02 17 views
4

我是新来的Android和Java都让我请你原谅,如果我的问题 被要求在不恰当的组或论坛。我做了一个净 申请我公司,最近他们要求我将它移植上 的Android以便在三星Galaxy标签安装。首先,我使用Eclipse,JDK 6,目标平台android 2.2 以及带有GalaxyTab插件的模拟器。我的操作系统是Windows 7.DatagramSocket.bind();套接字异常:无法分配请求的地址。 Android模拟器

本申请,发送和接收消息,并且从某种 控制器使用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的”,当我 请核实从仿真器将数据发送到控制器,该控制器 回复回来了正确的预期数据。然而, 插座,在应用程序中,在模拟器上没有收到任何东西,并保持阻塞 “接收”呼!

谁能帮我找出问题或错误我与我的应用程序的接收部分承诺!

任何帮助是非常赞赏,

回答

0

通常你看到错误消息,如果你想绑定到你不拥有一个IP地址。你确定你的Android模拟器的IP地址是192.168.1.240吗?仿真器IP可能与您的主机IP不同。

+1

谢谢你杰夫的帮助,并为您的信息。 我搜索了一下,发现链接上有一些代码:http://www.droidnova.com/get-the-ip-address-of-your-device,304.html,它允许我找到模拟器的IP正如你所说的,与我的电脑的IP非常不同。 我试着将它绑定到套接字,并导致“SocketException:无效的参数”。该程序仍然提供相同的操作!你有什么想法这个例外可能意味着什么? – TMI 2011-03-05 08:25:22

+0

@TMI不太确定这次可能是什么。但它看起来像你[不是唯一一个有这个问题](http://stackoverflow.com/questions/4163375/debug-sntpclient60-request-time-failed-java-net-socketexception-address-fami) – Jeff 2011-03-06 07:44:51

8

TMI,

[编辑:如果你看到我的其他答案,请无视,我做了一个测试改变两个变量的典型的错误,它是由区别的其他变量]

关于此问题:

我尝试将它绑定到套接字,并导致“SocketException:Invalid Argument”。该程序仍然提供相同的操作!你有什么想法这个例外可能意味着什么?

你现在可能已经解决了这个问题,但我只是有同样的问题,自己回答here

对我来说摆脱了这个异常是改变了我创建DatagramSocket的方式。

来源:

sock = new DatagramSocket(); 

要:

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

感谢一堆为此,你救了我:-)。我发现它更容易,但使用InetAddress.getByAddress(“192.168.1.240”); – Andy 2011-10-12 19:49:45

+0

我也为你提到的问题添加了一个答案(现在偶然发现了这个问题);基本上正确的解决方案是通过DatagramSocket(SocketAddress localAddr)构造函数创建一个未绑定的套接字,只是将null作为参数传递。有关详细信息,请参阅您在参考的问题中的答案。 – Newtron 2016-03-03 22:16:41

相关问题