Java UDP响应广播请求

时间:2014-06-11 13:21:42

标签: java udp

在工作中,我们正在开发一个与机顶盒(STB)通信的Android应用程序。

一切正常,但我试图创建一个" mock"应用程序可以连接的STB,以便我可以控制响应以进行测试。

我无法访问STB中的代码以了解他们如何设置套接字,但我确实有应用程序使用的客户端代码的简化版本。

这是客户端代码:

public class UDPClient {

public static void main(String[] args) throws SocketException, UnknownHostException {

    DatagramSocket c = new DatagramSocket(12345);
    c.setBroadcast(true);
    c.setSoTimeout(20000);

    String msearchData = "DATA";

    byte[] sendData = mSearchData.getBytes();

    try {
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("239.255.255.250"), 1900);
        c.send(sendPacket);

        System.out.println("Request packet sent");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // wait for reply
    byte[] recBuf = new byte[15000];
    DatagramPacket receivePacket = new DatagramPacket(recBuf, recBuf.length);
    try {
        c.receive(receivePacket);
        System.out.println("PACKET RECEIVED!");
        System.out.println(new String(receivePacket.getData()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    c.close();

}

}

当我在我的开发笔记本电脑上运行此代码时(我在使用该STB的无线网络上),STB会做出响应。

但是,我有另一台笔记本电脑设置假装在同一网络上的另一个STB(模拟STB)。

" mock" STB只是拒绝接收广播请求而且我被卡住了。

这里有一些我用来作为模拟STB的代码。我尝试了各种端口组合,但没有任何效果。

public class MockBox {

public static void main(String[] args) throws IOException {

    DatagramSocket socket = new DatagramSocket();
    socket.setBroadcast(true);

    while (true) {

        System.out.println(">>>Ready to receive broadcast packets!");

        byte[] recvBuf = new byte[15000];
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
        socket.receive(packet); // blocks

        // Packet received
        System.out.println(">>>Packet received from " + packet.getAddress().getHostAddress());
        System.out.println(">>>Packet data: " + new String(packet.getData()));
        socket.close();
    }
}

}

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

  1. 禁用软件防火墙。
  2. 使用MulticastSocket而不是DatagramSocket。 (注意:您在上面指定的地址是多播地址。)
  3. 使用至少为1的TTL。如果这不起作用,请使用2.重复,但不要在LAN上超过4或5,因为在那时,你是已经过去了。 (零赢了离开机器。使用太高的值可能导致数据包被丢弃在路径的某处。)