首页 文章

SSDP协议最简单的Reactor / Netty实现是什么?

提问于
浏览
0

我尝试了很多UdpClient,UdpServer,Spring Integration Ip模块的东西,包装DatagramSocket接收方法返回Flux,但我根本无法从标准SSDP 239.255.255.250:1900收到任何响应 .

奖励积分也用于向SSDP发送数据包 .

1 回答

  • 0

    对于那些感兴趣的人,这是一个片段 . 我能够通过Flux Launcher 而不是reactor-netty UDP类来实现 .

    private static final String SSDP_IP = "239.255.255.250";
    private static final int SSDP_PORT = 1900;
    private static final int TIMEOUT = 5000;
    
    String request = new String("example");
    byte[] receiveData = new byte[1024];
    DatagramPacket sendPacket = new DatagramPacket(request.getBytes(),
                request.getBytes().length, InetAddress.getByName(SSDP_IP), SSDP_PORT);
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length,
                InetAddress.getLocalHost(), SSDP_PORT);
    
    Flux<String> response = Flux.create(emitter -> {
        try (DatagramSocket socket = new DatagramSocket()) {
            socket.setSoTimeout(TIMEOUT);
            socket.send(sendPacket);
            while (true) {
                socket.receive(receivePacket);
                emitter.next(receivePacket.getData());
            }
        } catch (SocketTimeoutException e) {
            emitter.complete();
        } catch (IOException e) {
            emitter.error(e);
        }
    })
        .map(mapper -> new String(receivePacket.getData(), 0, receivePacket.getLength()))
    

相关问题