TMI*_*TMI 4 sockets android udp android-emulator
我是Android和Java的新手,所以如果我的问题在不适当的小组或论坛上被问到,请原谅.我为我的公司制作了一个.Net应用程序,最近他们让我在Android上移植它,以便在三星Galaxy Tabs上安装它.
首先,我使用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) {
.......
}
Run Code Online (Sandbox Code Playgroud)
这是我收听传入数据报的地方:
try{
buf = new byte[1024];
receive_pac = new DatagramPacket(buf, 1024);
soc.receive(receive_pac);
if (receive_pac.getData() != null){
.......
}
}
Run Code Online (Sandbox Code Playgroud)
这是我发送数据的地方:
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) {
......
}
Run Code Online (Sandbox Code Playgroud)
好吧,当我使用"soc.bind(...)"时,我收到以下异常:无法分配请求的地址
然后我收到一条调试消息(我不知道它是否相关):
DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol
Run Code Online (Sandbox Code Playgroud)
应用程序正在运行,我通过"WireShark"验证,当我要求仿真器将数据发送到控制器时,控制器会正确回复预期的数据.但是,应用程序中的套接字在模拟器上没有收到任何内容并且在"接收"调用中保持阻塞状态!
任何人都可以帮我弄清楚我在申请的接收部分犯了什么问题或错误!
任何帮助深表感谢,
TMI,
[编辑:如果你看到我的另一个答案,请忽略,我犯了一个经典的错误,即在一次测试中改变两个变量,而另一个变量则产生了不同.]
关于这个:
我尝试将它绑定到套接字,并导致"SocketException:Invalid Argument".程序仍然执行相同的操作!你知道这个例外可能意味着什么吗?
你现在可能已经解决了这个问题,但我有同样的问题并在这里自己回答.
摆脱这个例外的是改变我创建DatagramSocket的方式.
从:
sock = new DatagramSocket();
Run Code Online (Sandbox Code Playgroud)
至:
DatagramChannel channel = DatagramChannel.open();
DatagramSocket socket = channel.socket();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13244 次 |
最近记录: |