直播系统代码接入极光IM,实现即时聊天功能

发布来源:云豹科技
发布人:云豹科技
2022-10-27 10:00:53

随着直播系统代码的持续火热,直播间用户如何进行沟通交流就成为必须解决的问题,这时候就直播系统代码可以用到即时通讯功能。云豹科技作为优质的直播平台源码提供商,在即时聊天功能方面有着独到之处,下面为大家从解答一下即时聊天功能如何实现。

即时聊天这个需求存在于很多直播系统代码中,也是公认的技术难点。大部分网站都普遍采用http协议进行网络通信,而http协议的特点是只能由客户端主动向服务器发送消息,可是服务器无法主动向客户端发送消息。即时聊天要求服务器和客户端都可以主动发送消息,这就给实现即时聊天这个功能带来了根本上的困难。

常见的即时聊天实现方式是自建socket服务器,使用各种socket框架,编写服务端、客户端代码,其中涉及到消息发送、转发、用户在线判定、离线消息存储、未读消息提醒、会话列表、好友列表、拉黑、单点登录、并发量等问题,实现起来非常复杂,而且对开发和运维的要求非常高。

自建socket服务器的实现方式比较适合那些技术能力强,并且对即时聊天有大量自定义需求的公司。我们这里选择接入三方即时聊天服务,好处是集成简单方便,系统稳定,可靠性好,开发成本小。市面上常见的IM服务商有极光,环信,融云,腾讯等等。我们这里选择极光IM。 

一、集成极光IM。

1、先登录极光官网 https://www.jiguang.cn/

2、进入控制台,并创建应用

1.png

3、创建应用成功,按照文档说明进行相应的配置

2.png

这样就完成应用的创建和配置。

4、编写android代码,集成IM

/**
     * 登录极光IM
     */
    public void loginImClient(String uid) {
        final String imUid = getImUid(uid);
        JMessageClient.login(imUid, imUid + PWD_SUFFIX, new BasicCallback() {
            @Override
            public void gotResult(int code, String msg) {
                L.e(TAG, "登录极光回调---gotResult--->code: " + code + " msg: " + msg);
                if (code == 801003) {//用户不存在
                    L.e(TAG, "未注册,用户不存在");
                    registerAndLoginJMessage(imUid);
                } else if (code == 0) {
                    L.e(TAG, "极光IM登录成功");
//                    SpUtil.getInstance().setBooleanValue(SpUtil.IM_LOGIN, true);
                    JMessageClient.registerEventReceiver(JimMessageUtil.this);
                    CommonAppConfig.getInstance().setLoginIM(true);
                    //EventBus.getDefault().post(new ImLoginEvent(true));
                    refreshAllUnReadMsgCount();
                }
            }
        });
 
    }
 
    //注册并登录极光IM
    private void registerAndLoginJMessage(final String uid) {
        JMessageClient.register(uid, uid + PWD_SUFFIX, new BasicCallback() {
 
            @Override
            public void gotResult(int code, String msg) {
                L.e(TAG, "注册极光回调---gotResult--->code: " + code + " msg: " + msg);
                if (code == 0) {
                    L.e(TAG, "极光IM注册成功");
                    loginImClient(uid);
                }
            }
        });
    }
 
    /**
     * 登出极光IM
     */
    public void logoutImClient() {
        JMessageClient.unRegisterEventReceiver(JimMessageUtil.this);
        JMessageClient.logout();
        CommonAppConfig.getInstance().setLoginIM(false);
        L.e(TAG, "极光IM登出");
        EventBus.getDefault().post(new ImUnReadCountEvent("0"));
    }
 
 
    /**
     * 获取会话列表用户的uid,多个uid以逗号分隔
     */
    public String getConversationUids() {
        List<Conversation> conversationList = JMessageClient.getConversationList();
        if (conversationList != null) {
            List<String> uidList = new ArrayList<>();
            for (Conversation conversation : conversationList) {
                Object targetInfo = conversation.getTargetInfo();
                if (targetInfo == null || !(targetInfo instanceof UserInfo)) {
                    continue;
                }
                List<Message> messages = conversation.getAllMessage();
                if (messages == null || messages.size() == 0) {
                    String userName = ((UserInfo) targetInfo).getUserName();
                    JMessageClient.deleteSingleConversation(userName);
                    continue;
                }
                String from = getAppUid(conversation);
                if (!TextUtils.isEmpty(from)) {
                    uidList.add(from);
                }
            }
            if (uidList.size() > 0) {
                Collections.sort(uidList, mUidComparator);
                StringBuilder sb = new StringBuilder();
                for (String s : uidList) {
                    sb.append(s);
                    sb.append(",");
                }
                String uids = sb.toString();
                if (uids.endsWith(",")) {
                    uids = uids.substring(0, uids.length() - 1);
                }
                return uids;
            }
        }
        return "";
    }
 
    /**
     * 获取会话的最后一条消息的信息
     */
    public List<ImUserBean> getLastMsgInfoList(List<ImUserBean> list) {
        if (list == null) {
            return null;
        }
        for (ImUserBean bean : list) {
            Conversation conversation = JMessageClient.getSingleConversation(getImUid(bean.getId()));
            if (conversation != null) {
                bean.setHasConversation(true);
                Message msg = conversation.getLatestMessage();
                if (msg != null) {
                    bean.setLastTime(getMessageTimeString(msg));
                    bean.setUnReadCount(conversation.getUnReadMsgCnt());
                    bean.setMsgType(getMessageType(msg));
                    bean.setLastMessage(getMessageString(msg));
                    bean.setLastMsgId(msg.getId());
                }
            } else {
                bean.setHasConversation(false);
            }
        }
        return list;
    }


5、最后实现效果如下:

3.png4.png

通过集成极光IM,我们实现了直播系统代码的私信聊天功能。以上代码皆出自于直播系统代码,想要了解更多相关内容,可以关注一下我们。

声明:以上内容为云豹科技原创,未经作者本人同意,禁止转载,否则将追究相关法律责任www.yunbaokj.com

声明:
以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任