【问题标题】:To write chat programming using UDP and MQTT protocol in Android在 Android 中使用 UDP 和 MQTT 协议编写聊天程序
【发布时间】:2023-04-11 09:07:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android network-programming udp mqtt udpclient


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@hardillb
    【解决方案2】:

    我找到了在 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 中的所有其他设备都将通过该地址接收此消息。

    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();
    

    它就像一个魅力!

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多