Android 关于MQTT实现单聊和群聊功能,强大的技术 - Go语言中文社区

Android 关于MQTT实现单聊和群聊功能,强大的技术



这是一个客户端服务端架构的发布/订阅模式的消息传输协议;轻巧、开放、简单、规范,易于实现,国内很多关于Mqtt的文章都是讲推送的,其实Mqtt远远不止这个功能,具体详情可自行文档查阅。

在Android上,往往具体的业务逻辑要回到Activity中,而Mqtt连接则是建立在service中(考虑到内存资源及退出应用后续操作),同时Mqtt的消息透传回调也是在service中。
通常做法是要写很多类(通常是Boardcast)来实现确保service同Activity组件之间的通信,就像Eclipse paho的Android service一样。

但是我们再Android端  只需要写一个工具类就可以实现推送,单聊,群聊功能,怎么样是不是很强大?强大到怀疑人生,比什么环信SDK简单多了,基本可以忽略占用APK体积大小

来吧   跟到我打开一扇新的大门,见证技术的魅力。。。。。好了 不BB了,,,

首先需要添加依赖:

//MQTT
    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
    compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

Manifest 添加:

<!-- Mqtt Service -->
<service android:name="org.eclipse.paho.android.service.MqttService" />
以下是一个完整方法:

private void getMessage() {

    try {
        //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
        client = new MqttClient(host, "testasd",
                new MemoryPersistence());
        //MQTT的连接设置
        options = new MqttConnectOptions();
        //设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
        options.setCleanSession(false);
        //设置连接的用户名
        options.setUserName(userName);
        //设置连接的密码
        options.setPassword(passWord.toCharArray());
        // 设置超时时间 单位为秒
        options.setConnectionTimeout(30);
        // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
        options.setKeepAliveInterval(20);
        //设置回调
        client.setCallback(new MqttCallback() {

            @Override
            public void connectionLost(Throwable cause) {
                //连接丢失后,一般在这里面进行重连
                connect();
                System.out.println("connectionLost----------");
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                //publish后会执行到这里
                System.out.println("deliveryComplete---------"
                        + token.isComplete());
            }

            @Override
            public void messageArrived(String topicName, MqttMessage message)
                    throws Exception {
                //subscribe后得到的消息会执行到这里面
                // System.out.println("messageArrived----------");
                Message msg = new Message();
                msg.obj = message;
                msg.what = 1;
                hanlser.sendMessage(msg);

            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void connect() {
    new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                client.connect(options);
                Message msg = new Message();
                msg.what = 2;
                hanlser.sendMessage(msg);
            } catch (Exception e) {
                e.printStackTrace();
                Message msg = new Message();
                msg.what = 3;
                hanlser.sendMessage(msg);
            }
        }
    }).start();
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (client != null && keyCode == KeyEvent.KEYCODE_BACK) {
        try {
            client.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return super.onKeyDown(keyCode, event);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    try {
        scheduler.shutdown();
        client.disconnect();
    } catch (MqttException e) {
        e.printStackTrace();
    }
}


public void getMqttMessage(MqttMessage mqtt) {

    // Toast.makeText(this,mqtt.getMessage(),Toast.LENGTH_SHORT).show();
}

好了  ,关于Android 端MQTT实现聊天功能的讲解就都这里了,代码都有注释,相信你们都看得懂啦,俗话说是啥子马,大家可以拉出来溜溜!~~~~88,新年快乐,祝大家2018,有更大的提升

CSDN下载DEMO:点击打开链接

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/z815101/article/details/79352545
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-18 18:03:48
  • 阅读 ( 1358 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢