在Android中使用UDP和MQTT协议编写聊天编程

问题描述 投票:-1回答:2

我是Android编程的新手,不知道如何在Android设备中使用UDP和MQTT协议

我想在连接到同一Wi-Fi路由器的房间内建立一个聊天android到Android设备的应用程序。

但我不知道我应该绑定到DatagramSocket和DatagramPacket的IP地址和端口。

我在网上尝试了很多例子,但我不明白它在android中是如何工作的。

android network-programming udp mqtt udpclient
2个回答
2
投票

MQTT需要TCP,它是一个有状态协议,你不能用UDP实现它

有一个名为MQTT-SN的类似协议,可以使用像UDP这样的无状态协议来实现。

但是这两者仍然需要在某个地方运行的代理来协调向给定主题的订阅者传递消息


1
投票

我找到了在UDP协议上发送消息的代码,其工作原理如下。

public class SendUDP extends AsyncTask<Void, Void, String> {
    String message;

    public SendUDP(String message) {
        this.message = message;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void[] params) {

        try {
            DatagramSocket socket = new DatagramSocket(13001);
            byte[] senddata = new byte[message.length()];
            senddata = message.getBytes();

            InetSocketAddress server_addr;
            DatagramPacket packet;

            server_addr = new InetSocketAddress(getBroadcastAddress(getApplicationContext()).getHostAddress(), 13001);
            packet = new DatagramPacket(senddata, senddata.length, server_addr);
            socket.setReuseAddress(true);
            socket.setBroadcast(true);
            socket.send(packet);
            Log.e("Packet", "Sent");

            socket.disconnect();
            socket.close();
        } catch (SocketException s) {
            Log.e("Exception", "->" + s.getLocalizedMessage());
        } catch (IOException e) {
            Log.e("Exception", "->" + e.getLocalizedMessage());
        }
        return null;
    }

    @Override
    protected void onPostExecute(String text) {
        super.onPostExecute(text);
    }
}

以下功能用于获取LAN网络中连接的设备的广播IP地址,LAN中的所有其他设备将通过该IP地址接收此消息。

public static InetAddress getBroadcastAddress(Context context) throws IOException {
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifi.getDhcpInfo();
    // handle null somehow

    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));
    return InetAddress.getByAddress(quads);
}

这将在执行此操作后发送UDP消息

new SendUDP("Hello All Device").execute();

它就像一个魅力!

© www.soinside.com 2019 - 2024. All rights reserved.