我是新手,对于Android和Java都不太了解,如果我的问题在不适当的组或论坛中提出,请原谅。我为我的公司制作了一个.Net应用程序,最近他们要求我将其移植到Android上,以便安装在三星Galaxy Tab上。
首先,我使用的是Eclipse、JDK 6、目标平台为Android 2.2,以及带有GalaxyTab插件的模拟器。我的操作系统是Windows 7。
这个应用程序通过UDP发送和接收来自网络上某个控制器的消息。简单来说,我的应用程序使用“DatagramSocket”将其绑定到本地“InetSocketAddress”,然后启动一个线程来监听数据报,而另一个线程则在用户请求时向控制器发送请求。以下是一些代码片段:
这是我分配本地地址和套接字的地方:
这是我监听传入数据报的地方:
这是我发送数据的位置:
应用程序正在工作,我通过“WireShark”验证了当我要求从模拟器将数据发送到控制器时,控制器正确地回复了预期的数据。然而,在应用程序中,模拟器上的套接字没有接收到任何内容,并且在“接收”调用上保持阻塞状态!
有人能帮我找出我在应用程序接收部分犯了什么问题或错误吗?
非常感谢任何帮助。
首先,我使用的是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”验证了当我要求从模拟器将数据发送到控制器时,控制器正确地回复了预期的数据。然而,在应用程序中,模拟器上的套接字没有接收到任何内容,并且在“接收”调用上保持阻塞状态!
有人能帮我找出我在应用程序接收部分犯了什么问题或错误吗?
非常感谢任何帮助。
DatagramSocket(SocketAddress localAddr)
构造函数创建一个未绑定的套接字,只需将null作为参数传递即可。有关详细信息,请参见您引用的问题中的我的答案。 - Newtron