Android中使用 DatagramSocket 进行UDP数据发送接收,对端口绑定,绑定失败
在使用Android studio开发app的过程中,使用UDP的类DatagramSocket 进行数据的发送和接收,出现一个问题---- 在使用Android studio自带的安卓模拟器和从网络上下载的安卓模拟器进行模拟数据的发送和接收,往往只能将数据发送出去,但是接收不到,本文使用的接收代码如下:
//接收消息代码
DatagramSocket socket = new DatagramSocket(51280);
try {
while(!socket.isClosed()){
byte[] data = new byte[4*1024];
DatagramPacket packet =new DatagramPacket(data,data.length);
socket.receive(packet);
String msg= new String(packet.getData(),packet.getOffset(),packet.getLength());
notifyMain(1,msg);
Log.d(TAG,"\n收到的消息为:"+msg);
Log.d(TAG,DateUtil.getNowDateTime());
}
System.out.println("循环体执行结束···");
} catch (Exception e) {
e.printStackTrace();
if(!socket.isClosed()){
notifyMain(0,"未接收到消息");
}
}finally {
if(socket!=null && socket.isClosed() == false) {
socket.close();
System.out.println("------->>>>>>> 关闭了 2 socket");
}
}
分析
问题出现在下面的代码里,
DatagramSocket socket = new DatagramSocket(51280);
在进行端口绑定时,发现在模拟器里面app发送消息或接收消息的实际端口并不是自己定义的端口,而是模拟器随机分配给app的一个端口,导致接收数据时,发送端每次都必须根据当前app端口进行调整。
解决办法
这时候需要你找一个真实的手机安装app,才能成功的绑定指定的端口,端口才不会随机分配!
原因分析
在使用模拟器的时候,能看到一个类似真机的手机,由于是用软件虚拟出来的手机,这个虚拟出来的手机和真实的手机还不一样。模拟器里面app发送消息时的流程是:手机app---->模拟器---->电脑—>外部软件 (接收消息的过程相反)。出于安全原因或者端口占用的原因,模拟器就将你定义的端口给隐藏起来了,然后使用它给你分配的端口进行数据的传输或接收,这个时候在外部软件看来,你发送消息的端口就不是你自己定义的端口,因此接收消息时也必须使用模拟器分配给你的那个端口。