【问题标题】:How to Send M-SEARCH Query with Java如何使用 Java 发送 M-SEARCH 查询
【发布时间】:2015-04-08 18:23:53
【问题描述】:

我的网络上有一个 Roku 设备,我希望能够以编程方式发现它。 official Roku documentation 说:

有一个标准的 SSDP 组播地址和端口 (239.255.255.250:1900) 用于本地网络通信。 Roku 对此 IP 地址和端口的 M-SEARCH 查询做出响应。

为了查询 roku ip 地址,你的程序可以发送 以下请求使用 http 协议到 239.255.255.250 端口 1900:

他们提供了一个使用 netcat 的示例,他们说可以使用 wireshark 来查找结果。他们还说:

外部控制协议使 Roku 可以通过 网络。外部控制服务可通过 SSDP 发现 (简单服务发现协议)。该服务是一个简单的 RESTful API 几乎可以被任何编程中的程序访问 环境。

我有一个 java 程序,可以根据它的 IP 地址控制我的 Roku,我想实现一个功能,使用这个 SSDP 在网络上发现它。

如何使用 java 发送 M-SEARCH 查询?我完全不知道如何做到这一点。它像一个获取/发布请求吗?如果有人能指出我正确的方向,我将不胜感激!

【问题讨论】:

    标签: java networking ssdp


    【解决方案1】:

    我找到了一个java解决方案:

    /* multicast SSDP M-SEARCH example for 
     * finding the IP Address of a Roku
     * device. For more info go to: 
     * http://sdkdocs.roku.com/display/sdkdoc/External+Control+Guide 
     */
    
    import java.io.*;
    import java.net.*;
    
    class msearchSSDPRequest {
        public static void main(String args[]) throws Exception {
            /* create byte arrays to hold our send and response data */
            byte[] sendData = new byte[1024];
            byte[] receiveData = new byte[1024];
    
            /* our M-SEARCH data as a byte array */
            String MSEARCH = "M-SEARCH * HTTP/1.1\nHost: 239.255.255.250:1900\nMan: \"ssdp:discover\"\nST: roku:ecp\n"; 
            sendData = MSEARCH.getBytes();
    
            /* create a packet from our data destined for 239.255.255.250:1900 */
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("239.255.255.250"), 1900);
    
            /* send packet to the socket we're creating */
            DatagramSocket clientSocket = new DatagramSocket();
            clientSocket.send(sendPacket);
    
            /* recieve response and store in our receivePacket */
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);
    
            /* get the response as a string */
            String response = new String(receivePacket.getData());
    
            /* print the response */
            System.out.println(response);
    
            /* close the socket */
            clientSocket.close();
        }
    }
    

    【讨论】:

    • 难道没有必要在 MSEARCH 字符串的末尾添加第二个 \n 吗?就我而言。
    • @dr.doom 哦,有趣,没有第二个换行符对我来说效果很好,但很高兴知道在某些情况下可能需要它
    • 好吧,根据 http 规范,请求(第 5 节)和响应(第 6 节)消息使用 RFC 822 [9] 的通用消息格式来传输实体(消息的有效负载) .两种类型的消息都包含一个起始行、零个或多个标题字段(也称为“标题”)、一个指示标题字段结束的空行(即,在 CRLF 之前没有任何内容的行),可能还有一个邮件正文。所以空行是强制性的,如果没有正文,它标志着消息的结束......
    • 我必须在 MSEARCH 字符串值中添加“MX: 10”(不带引号)才能在 macOS Sierra 中工作
    • @ObjSal 哦,有趣!你必须在前面加上那个?在自己的线路上还是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2021-06-10
    • 2016-03-07
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多