Java UPnP ContentDirectory浏览返回null

Java UPnP ContentDirectory浏览返回null,java,upnp,Java,Upnp,我一直在玩UPnP,以了解它是如何工作的,在我尝试使用任何API之前,或者做任何更重要的事情之前。我一直在阅读UPnP文档,并使用这些信息格式化我发送的消息。我现在只是从命令行开始工作,并且已经获得了可以正常工作的发现消息。现在,我尝试从ContentDirectory Browse()请求返回内容(我还尝试了TransportAV GetMediaInfo(),因为它只需要一个参数)。然而,无论我尝试什么,我都会从MediaServer得到一个空响应 public class SOAPSock

我一直在玩UPnP,以了解它是如何工作的,在我尝试使用任何API之前,或者做任何更重要的事情之前。我一直在阅读UPnP文档,并使用这些信息格式化我发送的消息。我现在只是从命令行开始工作,并且已经获得了可以正常工作的发现消息。现在,我尝试从ContentDirectory Browse()请求返回内容(我还尝试了TransportAV GetMediaInfo(),因为它只需要一个参数)。然而,无论我尝试什么,我都会从MediaServer得到一个空响应

public class SOAPSocket2 {

    public static void main(String[] args) {

        try {
            String xmldata = "<?xml version=\"1.0\"?>" + 
                "<s:Envelope " +
                    "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/ \"" +
                    "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
                "<s:Body>" +
                    "<u:GetMediaInfo xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">" +
                        "<InstanceID>0</InstanceID>" +
                    "</u:GetMediaInfo>" +
                "</s:Body>" +
                "</s:Envelope>";

        //Create socket
        String hostname = args[0];
        int port = Integer.parseInt(args[1]);
        Socket sock = new Socket(hostname, port);

        //Send header
        String path = args[2];
        BufferedWriter  wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
        // You can use "UTF8" for compatibility with the Microsoft virtual machine.
        wr.write("POST " + path + " HTTP/1.1\r\n");
        wr.write("HOST: " + hostname + ":" + port +"\r\n");
        wr.write("CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n");
        wr.write("SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo\"");
        wr.write("\r\n");

        //Send data
        wr.write(xmldata);
        wr.flush();

        // Response
        BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));

        String line;
        line = rd.readLine();
        System.out.println(line);
        while((line = rd.readLine()) != null)
            System.out.println(line);
        } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
公共类SOAPSocket2{
公共静态void main(字符串[]args){
试一试{
字符串xmldata=”“+
"" +
"" +
"" +
"0" +
"" +
"" +
"";
//创建套接字
字符串hostname=args[0];
int port=Integer.parseInt(args[1]);
Socket sock=新套接字(主机名、端口);
//发送头
字符串路径=args[2];
BufferedWriter wr=新的BufferedWriter(新的OutputStreamWriter(sock.getOutputStream(),“UTF-8”);
//您可以使用“UTF8”与Microsoft虚拟机兼容。
write(“POST”+path+“HTTP/1.1\r\n”);
write(“主机:“+hostname+”:“+port+”\r\n”);
write(“内容类型:text/xml;字符集=\“utf-8\”\r\n”);
write(“SOAPACTION:\”urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo\”);
wr.write(“\r\n”);
//发送数据
wr.write(xmldata);
wr.flush();
//回应
BufferedReader rd=新的BufferedReader(新的InputStreamReader(sock.getInputStream());
弦线;
line=rd.readLine();
系统输出打印项次(行);
而((line=rd.readLine())!=null)
系统输出打印项次(行);
}捕获(例外e){
e、 printStackTrace();
}
}
}
我知道这不是最合适的代码,但我从这里借用了它:。我想,如果我真的能在响应中获得某种数据,那么我就可以正确地构建它。我对其进行了修改,以便从命令行传递媒体服务器的IP地址和端口,以及控制URL的路径。但是,我从媒体服务器上得到的只是“null”。有没有想过我做错了什么?谢谢

我从MediaServer收到一个空响应

这是来自MediaServer的响应吗?我想这只是BufferedReader告诉你没有什么可以回报的

这里有两件事可以调试(发送和接收),但是相同的工具应该对这两件事都有帮助。使用wireshark或其他网络流量捕获工具查看通过网络的实际数据。Wireshark将告诉您是否发送了响应(但您未能正确接收),或者是否从未收到响应(暗示您的消息不正确)。它也会显示你的信息,因为它是在电线上,使它更容易注意到错误

执行上述操作(如果您无法理解,请将消息粘贴到此处)是继续调试的最佳方式,但我已经看到代码中存在一些问题:

  • SOAPACTION行结尾缺少“\r\n”
  • 没有内容长度标题(正常情况下需要)

这些甚至都不是UPnP问题,实际上,消息不是正确的HTTP。尽管如此,本文档仍将有助于解决此类问题。

谢谢您的意见。我确实注意到\r\n丢失了,自启动此项目以来,我一直在查看设备体系结构。我也广泛使用Wireshark,但在这里发布之前找不到问题的根源。然而,我最终得到了第二台设备,可以用作控制点,并监控它们之间的流量。我注意到包含SOAP的数据包被标识为HTTP,但我的数据包没有。从BufferedWriter更改为PrintWriter最终解决了这个问题。再次感谢您的反馈。还有内容长度行。我忽略了这一点