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

在Android中使用UDP和MQTT协议编写聊天程序,android,network-programming,udp,mqtt,udpclient,Android,Network Programming,Udp,Mqtt,Udpclient,我是Android编程新手,不知道如何在Android设备中使用UDP和MQTT协议 我想构建一个应用程序,用于在房间内与连接到同一个Wi-Fi路由器的android设备聊天 但我不知道应该绑定到DatagramSocket和DatagramPacket的IP地址和端口 我在网上尝试了很多例子,但我不明白它在android中是如何工作的。MQTT需要TCP,它是一个全状态协议,不能用UDP实现 有一个类似的协议称为UDP,它可以用UDP这样的无状态协议来实现 但这两种方法仍然需要一个运行在某处的

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

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

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


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

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

有一个类似的协议称为UDP,它可以用UDP这样的无状态协议来实现


但这两种方法仍然需要一个运行在某处的代理来协调向给定主题的订阅者发送消息的过程

我找到了在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);
    }
}

它就像一个符咒

谢谢你@hardillb
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);
}
new SendUDP("Hello All Device").execute();