【问题标题】:Broadcasting an UDP packet from an Android app and detecting it from Node.js从 Android 应用程序广播 UDP 数据包并从 Node.js 检测它
【发布时间】:2015-08-05 16:18:38
【问题描述】:

我的 Android 应用需要知道在我的本地网络上运行服务器的机器的 ip。我的计划是在我的应用程序中广播一个 UDP 数据包并从服务器发回一个数据包,以便应用程序知道 IP。

这是我在 Android 上的代码:

...

new SendUDPTask().execute();

...

/************ getBroadcastAddress: know where to send the signal to find the server ***********/

private InetAddress getBroadcastAddress() {

    //setup
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifiManager.getDhcpInfo();

    //complicated stuff
    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++)
        quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);

    //return result
    InetAddress result = null;
    try {

        result = InetAddress.getByAddress(quads);

    } catch (UnknownHostException e) {

        e.printStackTrace();

    }

    return result;

}

/************ sendUDP: here e send the packet that will allow us to find the server ***********/

private DatagramPacket sendUDP(String req, int port) throws IOException {

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

    InetAddress broadcastAddress = getBroadcastAddress();
    DatagramPacket packet = new DatagramPacket(req.getBytes(), req.length(), broadcastAddress, port);
    socket.send(packet);

    byte[] buf = new byte[1024];
    packet = new DatagramPacket(buf, buf.length);
    socket.setSoTimeout(3000);

    //We wouldn't want to think our own message is the server's response
    String myAddress = getMyAddress();
    socket.receive(packet);
    while (packet.getAddress().getHostAddress().contains(
            myAddress))
    {
        socket.receive(packet);
    }

    socket.close();

    return packet;
}

/***************************** getMyAddress: the device's address *****************************/

public String getMyAddress() {

    try {

        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {

            NetworkInterface intf = en.nextElement();

            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {

                InetAddress inetAddress = enumIpAddr.nextElement();

                if (!inetAddress.isLoopbackAddress())
                    return inetAddress.getHostAddress();

            }

        }

    }
    catch (SocketException e) {

        e.printStackTrace();

    }

    return null;
}

private class SendUDPTask extends AsyncTask<String, Void, DatagramPacket> {

    private Exception exception;

    protected DatagramPacket doInBackground(String... params) {
        try {
            DatagramPacket packet = sendUDP("Ping", 31415);
            Log.d("GJ", packet.getAddress().getHostAddress().toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(DatagramPacket packet) {

    }
}

这是我电脑上的代码(Node.js):

var PORT = 31415;
var HOST = '127.0.0.1';

var dgram = require('dgram');
var server = dgram.createSocket('udp4');

server.on('listening', function () {
  var address = server.address();
  console.log('UDP Server listening on ' + address.address + ':' + address.port);
});

server.on('message', function (message, remote) {
  console.log(remote.address + ':' + remote.port + ' - ' + message);
});

server.bind(PORT, HOST);

我还没有发回任何东西,但我应该看到console.log。我没有看到任何东西,这一定意味着数据包没有到达。

有人有想法吗?

非常感谢

【问题讨论】:

    标签: android node.js sockets networking


    【解决方案1】:

    如果您将套接字绑定到环回 (127.0.0.1) 接口,您将不会收到在网络中广播的消息(在本例中为 192.168.1.255)。在 nodejs 服务器中将套接字绑定到 INADDR_ANY。

    【讨论】:

    • 我将server.bind(PORT, HOST); 更改为server.bind(PORT);。你是最棒的
    • 嗯。它工作了两次,现在没有了。我尝试将端口更改为 33333,但没有帮助
    • @Gejii,这应该是一个不同的问题。我不相信它在 nodejs 代理中。如果您在 nodejs 端运行 Wireshark,您将能够查看是否有 udp 到达该节点。我想它没有到达那个节点但是......
    • 它没有到达,我猜我的路由器不喜欢我广播。我最终遍历了本地子网中的所有 ip
    • @Gejii,我不会这样做,因为它可能与您要解决的问题相冲突。例如,如果您有一个不知道谁加入或离开的组,那么您永远不会事先知道所有 IP 地址。为什么不发送多播?我认为接入点会阻止广播,但不会阻止多播。
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多