java - 来自 Android 的多播
问题描述
我想在本地网络上的 Android 上使用多播(Android 是server/publisher)。问题是,即使我使用来自 baeldung的确切示例代码或书中的示例代码:Jeff Friesen - Learn Java for Android Development,数据包也不会到达本地网络上的任何其他设备。我使用 Wireshark 进行故障排除,只有在远程捕获 Android 的流量时才能看到这些数据包。我使用了不同的端口,不同的多播地址(以231、232、239,...开头),同时尝试了DatagramSocket和MulticastSocket,手动设置了网络接口,使用了MulticastLock,增加了TTL,关闭了防火墙等,但没有这些建议中的一些对我有用。
这是我的示例代码:
doAsync {
val group = InetAddress.getByName("224.0.0.114")
val socket = DatagramSocket()
while (true) {
val msg = "hello world".toByteArray()
val packet = DatagramPacket(msg, msg.size, group, 4239)
socket.send(packet)
Thread.sleep(1000)
}
}
和 Android 清单权限(我添加了应该与多播相关的所有内容):
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
我在物理设备(小米 Mi3,API 23)上测试代码,连接到与我的开发机器相同的 Wi-fi。我只能在同一设备上接收数据包。我还尝试发送广播消息并且广播工作正常。
没有错误,没有警告。我错过了什么吗?
感谢您的帮助。
解决方案
推荐阅读
- mql4 - 如何删除字符串的某个部分(如果存在)?
- dart - 了解int之间的区别?和 int(或 num?和 num)
- sql - 从包含 $id1,$id2,$id3 的 ids 字段中选择 $id
- ios - 在 NEHotspotConfiguration 中禁用“私人地址”,就像在 iOS Wifi 设置中一样
- javascript - fluent-ffmpeg:如何将许多文件与它们之间的淡入淡出合并
- html - 跟踪几乎相同页面之间的大 CLS 差异
- windows - 在 Windows 上的 Docker 中运行 Qt GUI 应用程序
- docker - 如何使用 Compose 将服务器目录挂载到 Docker 容器?
- javascript - 如何使用输入为其他输入定义小数?
- c# - 为什么 Blazor 假定可空组件参数不为空?