- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
长话短说:SSDP library没有收到数据报。 Wireshark 显示预期的(?)流量。
我正在使用 android-dlna library在 Android 应用程序中支持 SSDP。目标是发现支持 SSDP 的自定义设备,获取其 IP 地址,然后对其进行 RESTful API 调用。这在 iOS 上运行良好,但我在 Android 上接收数据报时遇到一些问题。
使用 Wireshark,我可以确定 SSDP 搜索结束,设备返回状态为 OK,但此循环永远不会通过 receive()
方法:
SSDPSearchMsg search = new SSDPSearchMsg(SSDP.ST_ContentDirectory);
Log.e("SSDP", search.toString());
SSDPSocket sock = null;
try {
sock = new SSDPSocket();
sock.send(search.toString());
while (true) {
Log.e("SSDP", "Receive...");//only called once (stuck here)
DatagramPacket dp = sock.receive();
Log.e("SSDP", "Datagram Received with data " + new String(dp.getData()));
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
Log.e("SSDP", "Closing Socket");
if (sock != null)
sock.close();
}
这一切都是在AsyncTask
中完成的。我看到以下打印到 logcat:
SSDP M-SEARCH * HTTP/1.1
SSDP Host:239.255.255.250:1900
SSDP Man:"ssdp:discover"
SSDP ST:urn:schemas-upnp-org:service:ContentDirectory:1
SSDP MX:3
SSDP
SSDP Receive...
Wireshark 报告以下相关数据报:
Source Destination Protocol Length Info
---------------------------------------------------------------------------
192.168.1.7 239.255.255.250 SSDP 175 M-SEARCH * HTTP/1.1
192.168.1.1 192.168.1.7 SSDP 356 HTTP/1.1 200 OK
最后,我有以下 list 权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_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.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
我忽略了什么?为什么我没有收到响应数据报?
最佳答案
我知道这是一个老问题,但它也让我绊倒了,所以也许这会帮助其他偶然发现这个问题的人。如果您没有获得 MulticastLock
, Android 过滤掉组播数据包,因此更新代码以获取 MulticastLock
并在完成后释放它。
final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock = wifi.createMulticastLock("ssdp");
try {
lock.acquire();
sock = new SSDPSocket();
sock.send(search.toString());
while (true) {
Log.e("SSDP", "Receive...");//only called once (stuck here)
DatagramPacket dp = sock.receive();
Log.e("SSDP", "Datagram Received with data " + new String(dp.getData()));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
Log.e("SSDP", "Closing Socket");
if (sock != null)
sock.close();
if(lock.isHeld()) {
lock.release();
}
}
需要以下权限(已在 OP 的 list 文件中)--
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
关于Android:SSDP 卡在 MulticastSocket.receive() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22920420/
我的服务器当前能够发送和接收多播数据包。我还添加了接收和发送单播数据包的功能。因此,我创建了“DatagramSocket uniRecv”和“DatagramSocket uniSend”来模仿多播
我正在使用多播编写一个java聊天应用程序。客户端可以在它们之间进行通信,但它们也可以向服务器发送预定义的消息,服务器始终对相应的预定义消息有相同的答案。 客户端和服务器端都可以接收和发送消息。它们都
我正在尝试让多播套接字在“服务器”应用程序上工作,该应用程序将向一堆 Android 手机发送信息。负责设置套接字并发送一些数据的代码片段如下: private MulticastSocket
我正在编写一个通过 MulticastSocket 进行通信的 Android 应用程序。它基本上工作正常,但我遇到了一个奇怪的错误:每当连接中断并恢复时(例如设备短暂失去 WiFi 连接),应用程序
这个问题已经有答案了: 奥 git _a (1 个回答) 已关闭 9 年前。 我编写了一些应该从 MulticastSocket 接收数据的代码。由于某种原因,套接字永远不会接收。我已将其分解为下面的
我正在尝试在我的 PC(Ubuntu,客户端)和手机(Android,服务器)之间创建简单的多播通信。 单播/TCP 连接工作没有任何问题,定义的端口 (37659) 在 PC 和手机上均打开。尝试使
我正在研究多人游戏中服务器-客户端通信的结构。 我得出的结论是,UDP 是最佳选择,因为它采用“一劳永逸”的使用方式,即使数据包丢失也不会阻止应用程序。我还将使用 TCP 发送需要可靠性的数据包,例如
我正在尝试订阅一个特定的市场数据提要,通过 FAST 协议(protocol)以多播方式分发。在Java中,有MulticastSocket,也有DatagramChannel支持多播。 我使用的
尝试调用 MulticastSocket 上的 joinGroup(addr) 时出现 SocketException。这只发生在我们设置为在机器启动时自动启动我们的应用程序的 Windows 机器上
我在 Android 中有一个应用程序使用 MulticastSocket 进行通信。我想在 J2ME 中编写类似的应用程序,使用 MulticastSocket 通过 WiFi 与 Android
我正在尝试在 Java 上执行一个简单的多播套接字示例。 MulticastSocket s = new MulticastSocket(6789); InetAddress group = In
我有 2 个线程想要调用: multicastSocket.send(dP1) 和 multicastSocket.send(dP2) 分别,其中dP1和dP2是不同的DatagramPacket对象
我有两个线程。第一个在循环中发送带有 MulticastSocket 的数据报;第二个线程在循环中使用相同的 MulticastSocket 实例接收数据报。 它似乎工作正常,但我仍然有疑问。 这两个
我开发客户端-服务器应用程序,实时工作。服务器和客户端通过小消息交换,所以我选择 UDP 作为我的体系结构(正如网络中许多文章所建议的那样)。使用默认 java 的 DatagramSocket/Da
我有一些线程在同一个 MulticastSocket 上写入(取决于调度,可能会发生多于一个线程同时在 MulticastSocket 上写入)。我是否必须通过使用某种形式的锁定让他们在每个计时器上写
我正在尝试在创建 MulticastSocket 后加入多播组。 做类似的事情: MulticastSocket mySocket = new MulticastSocket(4444); mySoc
当一个服务器向多个客户端广播时,哪个实现更快/更有效:MulticastSocket 或 DatagramSocket? 也请大家讨论一下,谢谢! 传递的消息涉及字符串和 float 。 最佳答案 决
我正在推理我的应用程序中的多播套接字线程安全性。首先,我有多个线程共享同一个多播套接字实例,该多播套接字用于加入同一端口上的不同组。这是我的问题: 我是否必须同步对 joinGroup() 和 lea
我可能对此处的绑定(bind)一词有根本的误解,但我对 MulticastSocket 的用法感到困惑。它是构造函数。他们不会做我理解他们应该做的事情,因此任何能帮助我消除误解的人都将不胜感激。 首先
我开始使用 MulticastSocket 编写代码,尝试制作一个简单的应用程序,使用客户端和服务器来发送消息。 我为服务器准备的代码: import java.io.IOException;
我是一名优秀的程序员,十分优秀!