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

写在前面


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

Demo工程主要用于演示SDK的API调用等,它位于SDK完整下载包的如下目录:
即时通讯框架MobileIMSDK的开发指南:Server端_s_demo_src.png

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

如果你只是想看看Demo的话,可以下载编译好的Demo包立即体验:它位于SDK完整下载包的 demo_binary/server/ 目录下。

第一部分:集成准备


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


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

找到lib包:
位于SDK完整下载包的 sdl_binary/Server/ 目录下:
即时通讯框架MobileIMSDK的开发指南:Server端_s_sdk_binary.png

第2步:引用lib包

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


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

以MobileIMSDK Server的Demo工程为例,结果如下图:
即时通讯框架MobileIMSDK的开发指南:Server端_QQ20151119-1.png

第二部分:编写代码


第1步:准备回调通知的实现类


① 框架基本事件回调实现类:
public class ServerEventListenerImpl implements ServerEventListener
{    
    // 用户身份验证回调方法定义
    // 服务端的应用层可在本方法中实现用户登陆验证。详细请参见API文档说明。
    @Override
    public int onUserLoginVerify(String userId, String token, String extra, Channel session)
    {
        System.out.println("正在调用回调方法:OnVerifyUserCallBack...");
        return 0;
    }

    // 用户登录验证成功后的回调方法定义
    // 服务端的应用层通常可在本方法中实现用户上线通知等。详细请参见API文档说明。
    @Override
    public void onUserLoginSucess(String userId, String extra, Channel session)
    {
        System.out.println("正在调用回调方法:OnUserLoginAction_CallBack...");
    }

    // 用户退出登录回调方法定义。
    // 服务端的应用层通常可在本方法中实现用户下线通知等。详细请参见API文档说明。
    @Override
    public void onUserLogout(String userId, Object obj, Channel session)
    {
        System.out.println("正在调用回调方法:OnUserLogoutAction_CallBack...");
    }

    // 通用数据回调方法定义(客户端发给服务端的(即接收user_id=0))
    // 上层通常可在本方法中实现如:添加好友请求等业务实现。详细请参见API文档说明。
    @Override
    public boolean onTransferMessage4C2S(Protocal p, Channel session)
    {
        System.out.println("收到了客户端"+from_user_id+"发给服务端的消息:str="+dataContent);
        return true;
    }

    // 通道数据回调函数定义(客户端发给客户端的(即接收user_id>0))。详细请参见API文档说明。
    // 上层通常可在本方法中实现用户聊天信息的收集,以便后期监控分析用户的行为等^_^。
    @Override
    public void onTransferMessage4C2C(Protocal p)
    {
        System.out.println("收到了客户端"+from_user_id+"发给客户端"+userId+"的消息:str="+dataContent);
    }

    // 通用数据实时发送失败后的回调函数定义(客户端发给客户端的(即接收user_id>0))
    // 开发者可在此方法中处理离线消息的保存等。详细请参见API文档说明。
    @Override
    public boolean onTransferMessage_RealTimeSendFaild(Protocal p)
    {
        System.out.println("客户端"+from_user_id+"发给客户端"+userId+"的消息:str="+dataContent
                        +"因实时发送没有成功,需要上层应用作离线处理哦,否则此消息将被丢弃.");
        return false;
    }
}

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

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

第2步:服务端最终配置和实现

public class ServerLauncherImpl extends ServerLauncher
{
    /**
      * 静态类方法:进行一些全局配置设置。
      */
    static
    {
        // 设置MobileIMSDK服务端的UDP网络监听端口
        GatewayUDP.PORT = 7901;
        // 设置MobileIMSDK服务端的TCP网络监听端口
        GatewayTCP.PORT = 8901;

        // 设置MobileIMSDK服务端仅支持UDP协议
//         ServerLauncher.supportedGateways = Gateway.SUPPORT_UDP;
        // 设置MobileIMSDK服务端仅支持TCP协议
//        ServerLauncher.supportedGateways = Gateway.SUPPORT_TCP;
        // 设置MobileIMSDK服务端同时支持UDP、TCP两种协议
        ServerLauncher.supportedGateways = Gateway.SUPPORT_UDP | Gateway.SUPPORT_TCP;

        // 开/关Demog日志的输出
        QoS4SendDaemonS2C.getInstance().setDebugable(true);
        QoS4ReciveDaemonC2S.getInstance().setDebugable(true);
        ServerLauncher.debug = true;

        // 与客户端协商一致的心跳频率模式设置
//        ServerToolKits.setSenseModeUDP(SenseModeUDP.MODE_15S);
//        ServerToolKits.setSenseModeTCP(SenseModeTCP.MODE_15S);

        // 关闭与Web端的消息互通桥接器(其实SDK中默认就是false)
        ServerLauncher.bridgeEnabled = false;
        // TODO 跨服桥接器MQ的URI(本参数只在ServerLauncher.bridgeEnabled为true时有意义)
//        BridgeProcessor.IMMQ_URI = "amqp://js:19844713@192.168.0.190";

        // 设置最大TCP帧内容长度(不设置则默认最大是 6 * 1024字节)
//        GatewayTCP.TCP_FRAME_MAX_BODY_LENGTH = 60 * 1024;
    }

    /**
      * 实例构造方法。
      *
      * @throws IOException
      */
    public ServerLauncherImpl() throws IOException
    {
        super();
    }

    /**
      * 初始化消息处理事件监听者.
          */
    @Override
    protected void initListeners()
    {
        // ** 设置各种回调事件处理实现类
        this.setServerEventListener(new ServerEventListenerImpl());
        this.setServerMessageQoSEventListener(new MessageQoSEventS2CListnerImpl());
    }

    public static void main(String[] args) throws Exception
    {
        // 实例化后记得startup哦,单独startup()的目的是让调用者可以延迟决定何时真正启动IM服务
        final ServerLauncherImpl sli = new ServerLauncherImpl();

        // 启动MobileIMSDK服务端的Demo
        sli.startup();

        // 加一个钩子,确保在JVM退出时释放netty的资源
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                sli.shutdown();
            }
        });
    }
}

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


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

为了配合Android、iOS客户端,Server端也需要进行设置。


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

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

附录2:服务端如何向客户端推送/发送数据(或消息)?


服务端使用 LocalSendHelper 类中的sendData系列方法即可,详见下图:
即时通讯框架MobileIMSDK的开发指南:Server端_s_api_doc.png

API文档在线地址:http://docs.52im.net/extend/docs/api/mobileimsdk/server_tcp/

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


如下图所示:Github淘宝 得到的核心库工程和Demo演示工程
即时通讯框架MobileIMSDK的开发指南:Server端_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包:
即时通讯框架MobileIMSDK的开发指南:Server端_1-6.png

附录4:如何开启SSL/TLS传输加密


1您需要准备一个SSL/TLS证书(支持自签名证书)


可以使用正规CA机构签发的证书,也可以使用自签名证书,如何生成自签名证书可自行百度,这方面资料很丰富。

证书文件就像这样:
即时通讯框架MobileIMSDK的开发指南:Server端_1.png

注:如果你不想买证书,也不知道如何生成自签名证书,可以跟着这篇文章自已做《手把手教你为基于Netty的IM生成自签名SSL/TLS证书》。

2代码中启用SSL/TLS加密


* 将准备好的证书放置到服务端工程的此目录下以MobileIMSDK的服务端Demo工程为例):
即时通讯框架MobileIMSDK的开发指南:Server端_2.png

即时通讯框架MobileIMSDK的开发指南:Server端_3.png

* 启用SSL/TLS配置取消此行代码注释即可):
即时通讯框架MobileIMSDK的开发指南:Server端_4.png

* 启用SSL/TLS后的运行效果服务端控制台log中出现此字样即表示SSL/TLS启用成功!):
即时通讯框架MobileIMSDK的开发指南:Server端_5.png


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


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


即时通讯框架MobileIMSDK的开发指南:Server端_all-in-one.png

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

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

上一篇:即时通讯框架MobileIMSDK的开发指南:iOS客户端下一篇:[已回复] 想问个问题,如果用C++开发是否接用不了这套SDK了呢

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

推荐方案
评论 39
引用:JackJiang 发表于 2023-03-20 17:51
没让你开啊,谁让你开的

了然,感谢大佬
引用:zcy 发表于 2023-03-20 17:47
还有个疑问大佬,我开启了跨服桥接器,但是没有B2B的实际业务,只存在C2S S2C这两种模式,为什么会有信息 ...

没让你开啊,谁让你开的
引用:JackJiang 发表于 2023-03-20 16:24
完成跟MobileIMSDK-Web的互通

还有个疑问大佬,我开启了跨服桥接器,但是没有B2B的实际业务,只存在C2S S2C这两种模式,为什么会有信息被添加到mq中,mq不是只用来解决web->web的情况吗
学习到了
引用:zcy 发表于 2023-03-20 13:53
感谢大佬分享,跨服桥接器是为了完成什么任务

完成跟MobileIMSDK-Web的互通
感谢大佬分享,跨服桥接器是为了完成什么任务
2023年2月18日本贴新增附录4:如何开启SSL/TLS传输加密”章节内容。
引用:139yu 发表于 2022-09-13 15:48
jdk使用的是java11嘛

并没有用到依赖于jdk版的特性,虽然我不喜欢追求新版本,但技术上来说应该可以很好兼容
jdk使用的是java11嘛
引用:jungle1992 发表于 2022-01-22 17:36
原来如此,按照你的demo  可以运行起来了,打算试一下您提供的现成的client demo,感谢楼主,感谢52IM:lo ...

引用:JackJiang 发表于 2022-01-22 11:31
这种完整的通信框架肯定不是你用hello world的方法能测试的好的。

因为对于原始的tcp通信,框架它本身 ...

原来如此,按照你的demo  可以运行起来了,打算试一下您提供的现成的client demo,感谢楼主,感谢52IM
引用:jungle1992 发表于 2022-01-22 10:34
我下载的server的demo 并且跑起来了 但是我用调试助手连接的时候,出现这个问题,请问楼主这是啥呢?

这种完整的通信框架肯定不是你用hello world的方法能测试的好的。

因为对于原始的tcp通信,框架它本身有3个处理:

1)数据通信是存在粘包和半包处理的(也就是它是有完整包头、数据帧格式定义的):
即时通讯框架MobileIMSDK的开发指南:Server端_WX20220122-112748@2x.png

2)通信的数据本身也是存在格式定义的,见:Protocal

3)框架自身还存在心跳检测机制,一定间隔内没有收到心跳包服务端是会主动关掉连接,所以要保持这个连接,你用的市面上的那种简单工具也是很难同时模拟的。

所以:测试的话,你应该用MobileIM自带的客户端Demo来测,如果想分析协议层,可以用WireShark这样的工具,市面上的那些工具只能测试一些简单的通信,没什么用。

*********************** ***********************
如果非要用这种工具来测试的话,可以像我下面这样去测试:

这里有一段我抓取的ECHO指令测试样本,你放到你工具里试试看是不是有返回:

000000587b22627269646765223a66616c73652c2274797065223a352c2264617461436f6e74656e74223a2241222c2266726f6d223a22616161222c22746f223a2230222c22516f53223a66616c73652c227479706575223a2d317d


先设置好测试工具:
即时通讯框架MobileIMSDK的开发指南:Server端_测试工具(停止时).png

工具进行ECHO指令循环发送的接收效果(绿色的部分,就是服务端返回的):
即时通讯框架MobileIMSDK的开发指南:Server端_测试工具(定时发送时).png
我下载的server的demo 并且跑起来了 但是我用调试助手连接的时候,出现这个问题,请问楼主这是啥呢? 即时通讯框架MobileIMSDK的开发指南:Server端_1.jpg
引用:派大星先生 发表于 2020-08-12 11:10
我不知道怎么让ssm项目启动完成后,调用服务端ServerLauncherImpl类

在你的SpringApplication启动代码之后调用就好了。
神秘人  发表于 3 年前
引用:JackJiang 发表于 2020-08-12 10:35
报什么错?

我不知道怎么让ssm项目启动完成后,调用服务端ServerLauncherImpl类
引用:派大星先生 发表于 2020-08-12 07:59
ssm项目怎么启动后启动im服务啊,一直报错

报什么错?
神秘人  发表于 3 年前
ssm项目怎么启动后启动im服务啊,一直报错
引用:小小搬码工 发表于 2019-02-26 16:57
那谢谢,我了解,确实跨集群实现比较麻烦,你发的报告跨国的单一架构的虽然有时有些延迟,只要不要太大就 ...

合适的时机做合适的事,不用勉强的
引用:JackJiang 发表于 2019-02-26 16:38
其实mobileimsdk设计的时候就考虑了跨国运营,你可以看看这个运营过的产品数据:http://www.52im.net/thr ...

那谢谢,我了解,确实跨集群实现比较麻烦,你发的报告跨国的单一架构的虽然有时有些延迟,只要不要太大就没有太大的问题,而且暂时也没有那么用户量需求
签名: 来至普宁南溪镇,去往我也不知道的前方 *_*
引用:小小搬码工 发表于 2019-02-26 16:36
其实主要应用的范围比较广,就是差不多是全球的,一台服务器有些范围覆盖不到,通信会差,所以打算在不同 ...

其实mobileimsdk设计的时候就考虑了跨国运营,你可以看看这个运营过的产品数据:http://www.52im.net/thread-21-1-1.html

我个人建议是,能简单架构解决的就尽量别搞跨国集群,技术复杂性不只是代码问题,还有运维和基础设施投入,一般的团队是hold不住的。

以上只是个人意见,仅供参考
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部