默认
打赏 发表评论 14
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
即时通讯框架MobileIMSDK的开发指南:Java客户端
微信扫一扫关注! 其它资料链接请回到详细介绍页↘http://www.52im.net/thread-52-1-1.html

* 本贴最新更新于20240508日,增加了IDEA的相关截图。

写在前面


友情提示:在着手基于MobileIMSDK开发自已的即时通讯应用前,建议以Demo工程为脚手架,快速上手MobileIMSDK!

Demo工程主要用于演示SDK的API调用等,它位于SDK完整下载包的如下目录:
java_demo_src.png

如上图目录demo_src/TCP_Client/MobileIMSDK4jDemo_tcp/所示,这是一个完整的Eclipse工程(含完整的可运行Demo源码)。

如果你只是想看看Demo的话,可以下载编译好的Demo立即运行:点此进入

第一部分:集成准备


第1步:下载SDK并找到lib包


马上下载:
最新版打包下载 点此进入,或者前往 MobileIMSDK的Github 自行同步代码。

找到lib包:
位于MobileIMSDK完整下载包的 sdk_binary/Client_TCP/java/ 目录下:
java_sdk_binary.png

第2步:引用lib包


提示:MobileIMSDK的Java客户端lib包支持Java 1.6(含)及以上版本。


2.1IDEA中引用lib包


IDEA中如何引用第3方jar包?
跟所有Java工程一样引用jar包很简单,如果没试过,请查看:IDEA引入本地jar包的两种方法 或自行百度查找资料。

以MobileIMSDK的Demo工程为例,结果如下图:
1.png

2.2Eclipse中引用lib包


Eclipse中如何引用第3方jar包?
跟所有Java工程一样引用jar包很简单,如果没试过,请查看:Eclipse中导入外部jar包Eclipse下导入外部jar包的3种方式

以MobileIMSDK的Demo工程为例,结果如下图:
未命名.png

第二部分:编写代码


第1步:基本配置

// 设置AppKey
ConfigEntity.appKey = "5418023dfd98c579b6001741";

// 设置服务器ip和服务器端口
ConfigEntity.serverIP = 您的IM服务器IP地址或域名;
ConfigEntity.serverUDPPort = 7901;

第2步:回调设置


① 框架基本事件回调实现类:
public class ChatBaseEventImpl implements ChatBaseEvent
{        
    // 登陆/掉线重连结果通知
    @Override
    public void onLoginMessage(int dwUserId, int dwErrorCode)
    {
        if (dwErrorCode == 0) 
            System.out.println("登录成功,当前分配的user_id="+dwUserId);
        else 
            System.out.println("登录失败,错误代码:" + dwErrorCode);
    }

    // 掉线事件通知
    @Override
    public void onLinkCloseMessage(int dwErrorCode)
    {
        System.out.println("网络连接出错关闭了,error:" + dwErrorCode);
    }
}

② 实时消息事件回调实现类:
public class ChatTransDataEventImpl implements ChatTransDataEvent
{
    // 收到即时通讯消息通知
    @Override
    public void onTransBuffer(String fingerPrintOfProtocal, int dwUserid, String dataContent)
    {
        System.out.println("收到来自用户"+dwUserid+"的消息:"+dataContent);
    }

    // 收到服务端反馈的错误信息通知
    @Override
    public void onErrorResponse(int errorCode, String errorMsg)
    {
        System.out.println("收到服务端错误消息,errorCode="+errorCode+", errorMsg="+errorMsg);
    }
}

③ QoS相关事件回调实现类:
public class MessageQoSEventImpl implements MessageQoSEvent
{
    // 消息无法完成实时送达的通知
    @Override
    public void messagesLost(ArrayList<;Protocal> lostMessages)
    {
        System.out.println("收到系统的未实时送达事件通知,当前共有"
            +lostMessages.size()+"个包QoS保证机制结束,判定为【无法实时送达】!");
    }

    // 对方已成功收到消息的通知
    @Override
    public void messagesBeReceived(String theFingerPrint)
    {
        if(theFingerPrint != null)
            System.out.println("收到对方已收到消息事件的通知,消息指纹码="+theFingerPrint);
    }
}

* 设置好事件回调通知监听:
ClientCoreSDK.getInstance().setChatBaseEvent(new ChatBaseEventImpl());
ClientCoreSDK.getInstance().setChatTransDataEvent(new ChatTransDataEventImpl());
ClientCoreSDK.getInstance().setMessageQoSEvent(new MessageQoSEventImpl());

第3步:登陆请求

new LocalUDPDataSender.SendLoginDataAsync(用户名, 密码){
    @Override
    protected void fireAfterSendLogin(int code)
    {
        if(code == 0)
            System.out.println("数据发送成功!");
        else
            System.out.println("数据发送失败。错误码是:"+code+"!");
    }
}.execute();

第4步: 发送消息

new LocalUDPDataSender.SendCommonDataAsync("这是一条测试信息...", 对方的userId, true){
    @Override
    protected void onPostExecute(Integer code)
    {
        if(code == 0)
            System.out.println("数据已成功发出!");
        else
            System.out.println("数据发送失败。错误码是:"+code+"!");
    }
}.execute();

第三部分:常见开发问题附录


附录1:可以让客户端更省电吗?

当然,因为MobileIMSDK的Java客户端是运行于PC平台,因而是否省电的问题是无需考虑的。但为了配合Android、iOS客户端以及服务端,Java端也需要进行设置。


请调用以下API进行设置即可(框架默认工作在SenseMode.MODE_15S模式下):
// MobileIMSDK核心IM框架的敏感度模式设置
ConfigEntity.setSenseMode(SenseMode.MODE_15S);
MobileIMSDK预定义了多种模式,详细API说明:点此进入

特别说明:为了保证算法的一致性,以上设置需所有平台客户端和服务端都保持一致,否则将发生不可预测问题。

附录2:登陆请求结果为何是异步收到的?应用层如何处理体验更佳?

MobileIMSDK的服务端反馈回来的登陆结果是异步到达,但这对开发者来说,只要代码处理得当,实现起来同样简单:即登陆请求发起前设置一个登陆结果观察者需可。


最佳实践详见Java客户端Demo代码 LoginGUI.doLoginImpl() 2.png

附录3:核心库工程与Demo演示工程的关系说明


如下图所示:Github淘宝 得到的核心库工程和Demo演示工程
1-5.png
▲ 左边为MobileIMSDK的各平台核心库工程,右边为各平台的Demo演示工程

* 什么是核心库工程?
核心库工程就是MobileIMSDK的所有框架源码,它只是个lib库,它的作用就像Spring boot、Struts、log4j这些第3库lib库一样:是打成jar包放到您的工程里使用的,您调用它就能实现它提供的功能,它自已本身并不能自已运行(你不可能让log4j或Spring boot能双击就运行吧?

* 什么是Demo演示工程?
正如“什么是核心库工程?”一节所说,MobileIMSDK的核心库是不能直接运行的,它需要打成jar包被您的工程引用并调用后,才能发挥它的作用,所以MobileIMSDK的Demo演示工程的目的就是为了告诉你:如何引用MobileIMSDK的核心库jar包、如何调用MobileIMSDK的API,读Demo代码就知道如何使用它了(所以Demo代码唯一的意义就是为您演示库的调用,别无他用)!

* “我”的工程中使用使用核心库工程?
为了方便日后的升级,建议使用MobileIMSDK编译好的核心库jar包,当然您也可以直接把MobileIMSDK核心库源库放到您的工程中(而不是使用编译好的jar包)。

* 您可以在MobileIMSDK的Github如下目录中找到打包编译好的jar包:
1-6.png

捐助作者,得MobileIMSDK精编注释版


点击以下链接,前往淘宝下单,付款后发货到您的指定邮箱:


all-in-one.png

(更多详情请进入:http://www.52im.net/thread-411-1-1.html

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:即时通讯框架MobileIMSDK:压力测试报告下一篇:即时通讯框架MobileIMSDK:常见问题解答

本帖已收录至以下技术专辑

推荐方案
评论 14
感谢楼主分享
您好,这个方法我下载的源码怎么只有一个参数onLoginMessage
签名: 我好难
引用:sunny1009 发表于 2019-11-25 17:06
您好,这个方法我下载的源码怎么只有一个参数onLoginMessage

你打算做什么功能?
你想调用什么api?
你看到的是什么代码?(截图)
有个疑问哈,可以不用登录吗。我的使用场景,就是端到端的传输。两个电脑
引用:3jia 发表于 2022-02-06 10:59
有个疑问哈,可以不用登录吗。我的使用场景,就是端到端的传输。两个电脑

让用户无感知的自动登陆就好了。通信程序所谓的“登陆”其实就是建立长连接的过程,这路http短连接这种用的时候才连接是不一样的,所以这个流程省不了,最多在用户体验上做优化。
引用:JackJiang 发表于 2022-02-06 11:03
让用户无感知的自动登陆就好了。通信程序所谓的“登陆”其实就是建立长连接的过程,这路http短连接这种用 ...

感谢回复,因为我的使用场景是极端弱网环境,数据往返有5秒的延迟,单个数据包传输不超过1k(所以需要拆包)。tcp协议完全无法满足要求。所以我有很多疑问,不知道该框架是否满足需求。
引用:3jia 发表于 2022-02-06 14:47
感谢回复,因为我的使用场景是极端弱网环境,数据往返有5秒的延迟,单个数据包传输不超过1k(所以需要拆 ...

卫星网吗

另外,这种极端网络你可以试一下MobileIMSDK的UDP协议版本,udp协议在极端网络下比tcp表现要好很多,因为它没有tcp协议里那种质量保证算法的包袱
请问一下,MobileIMSDK的UDP协议版本,是如何解决拆包、分包的问题。
引用:JackJiang 发表于 2022-02-06 20:24
卫星网吗

另外,这种极端网络你可以试一下MobileIMSDK的UDP协议版本,udp协议在极端网络下比tcp表现要 ...


请问一下,MobileIMSDK的UDP协议版本,是如何解决拆包、分包的问题。
引用:3jia 发表于 2022-02-06 23:04
请问一下,MobileIMSDK的UDP协议版本,是如何解决拆包、分包的问题。

sdk层不会强制按某种规则进行复杂的包拆装处理的(否则那做的越面面俱到,也就越像tcp了),你可以在应用层按照你的业务特性自已决定怎么拆装包
引用:3jia 发表于 2022-02-06 14:47
感谢回复,因为我的使用场景是极端弱网环境,数据往返有5秒的延迟,单个数据包传输不超过1k(所以需要拆 ...

现在的云计算架构、微服务架构、分布式架构。都对网络做透明要求,要求网络100%可达、可靠、低时延、高吞吐,真实网络场景真的复杂的很!
签名: Coder
老大,请问,有没有 C#客户端的方案啊?谢谢
引用:ec0li@qq.com 发表于 2022-12-29 15:24
老大,请问,有没有 C#客户端的方案啊?谢谢

没有c#的,我对C#不熟悉,不过用c#写Im真的很少见

一个JavaSDK中,我希望可以区分不同用户,分开登录、退出登录、发消息。可以做到吗?注意,我不希望使用webSDK。

我希望做到这样的效果:这个JavaSDK集成到一个web服务中,让不同用户通过这个JavaSDK获取到和IM服务端通信的能力。这样方便我提供web的api接口,来赋予不同用户IM通信能力,而不是使用webSDK。

可以做到这样的效果吗?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部