我正在为Android手机编写一个Java程序,使用UDP套接字,包括UDP广播。我使用的是当前的Android Studio(Flamingo)和SDK(33),以及运行Android 13的默认Pixel 3 Emulated设备,所有这些都安装并运行在MacBook Pro M2上。
在我的Activity启动时,我运行以下代码:
discoverSocket = new DatagramSocket();
discoverSocket.setBroadcast(true);
discoverSocket.setReuseAddress(true);
discoverSocket.setSoTimeout(100);
discoverSocket.bind(new InetSocketAddress("0.0.0.0", DISCOVER_LOCAL_PORT));
DISCOVER_LOCAL_PORT是7001。
当它运行这段代码时,会抛出异常“java .NET.SocketException:但是在这个设备/模拟器上没有其他东西在运行--事实上,我只是冷启动了它。
我在这件事上没有选择--我必须与另一个使用设计不佳的协议的设备交谈,其中它响应的设备(例如,这个设备)的端口必须是这个数字。但是,尝试其他几个端口号,我得到同样的错误。
我以前写过一个在Windows笔记本电脑上运行的C++程序,运行得很好,所以我有一定的信心,问题出在Java代码/运行时/ Android / Emulator设置上,而不是底层协议或网络。
那么,为什么我会得到一个“已绑定”的异常呢?没有别的东西束缚在这里。这是 Boot 后的第一次启动,所以它也不可能是我的程序的上一次迭代。
我在《古兰经》中所作的声明如下:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
模拟设备是否不能绑定到指定的UDP端口,或者是否还有其他问题?我也在我的Pixel 7 Pro上通过WiFi调试尝试了这个,得到了同样的错误。
1条答案
按热度按时间xmd2e60i1#
答案是:
new DatagramSocket()
将立即绑定到构建时的某个随机端口。尽管bind()
是套接字上的一个可用方法。我需要向DatagramSocket
的构造函数提供接口地址和端口号以正确绑定它,或者只提供端口号以绑定到所有接口。因此,固定代码为:
似乎你仍然可以设置重用地址选项和广播选项,即使在创建?也许它在构造函数中为自己设置了一个端口,但是直到你发送第一个数据报,或者试图读取第一个数据报,它才真正绑定?
我还发现模拟器不能桥接到我的本地Wifi网络,所以我必须在真实的设备上调试它。
但至少现在它起作用了。