我正在尝试为某个支持UPnP的电视编写一个非常简单的SSDP发现例程。这是我的代码的简化版本:
private void discover() {
String header = "M-SEARCH * HTTP/1.1";
String[][] fields = new String[][] {
{"ST", "ssdp:all"},
{"MAN", "\"ssdp:discover\""},
{"HOST", "239.255.255.250:1900"},
{"MX", "10"}};
String p=this.make_packet(header, fields);
MulticastSocket s = null;
ArrayList<String> devices=new ArrayList<String>();
String[] ret;
String[] loc;
try {
InetAddress addr=InetAddress.getByName("239.255.255.250");
s = new MulticastSocket(1900);
s.setReuseAddress(true);
s.setSoTimeout(3000);
s.joinGroup(addr);
DatagramPacket pack=new DatagramPacket(p.getBytes("UTF-8"), p.length(), addr, 1900);
s.send(pack);
byte[] buffer=new byte[1024];
DatagramPacket packrec=new DatagramPacket(buffer, 1024);
for(;;) {
System.out.println("Waiting for response...");
s.receive(packrec);
System.out.println(new String(buffer, 0, packrec.getLength()));
}
} catch (Exception e) {
System.out.println(e);
}
}
我通过控制台在Win8机器上编译并运行代码。套接字始终只收到一个响应:要发送的消息的1:1副本。我想这可能是正确的,因为套接字在开始时加入了多播组。但是,没有其他UPnP设备回复,尽管我可以在第三方UPnP检查员中看到它们。
使用WireShark观看网络流量时,我的代码似乎根本没有发送任何包,尽管没有抛出任何异常。当使用来自同一台机器的不同UPnP检查器扫描网络时,WireShark会记录出站包(尽管奇怪的是,某些设备的回复不是,即使检查员发现它们)。
我现在四天乱搞这个,但无济于事。有什么想法吗?
谢谢, 埃里克
P.S。:JDK 1.8.0_45(64位)