全平台开源即时通讯IM聊天框架MobileIMSDK的服务端开发指南,支持鸿蒙NEXT

写在前面

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

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

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

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

第一部分:集成准备

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

 马上下载:

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

 找到lib包:

位于SDK完整下载包的 sdl_binary/Server/ 目录下:

第2步:引用lib包和依赖库

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

2.1 引用lib包(IDEA工程,本地jar方式)

 IDEA中如何引用第3方本地jar包?

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

 以MobileIMSDK Server的Demo工程为例,结果如下图:

2.2 引用lib包(IDEA工程,Maven方式)

 IDEA中如何在pom.xml中引用本地jar包和依赖库?

在pom.xml加入以下配置:(以下配置参考自IM产品 RainbowChat

<dependencies>


  <!-- 依赖的开源JSON库Gson -->

  <dependency>

    <groupId>com.google.code.gson</groupId>

    <artifactId>gson</artifactId>

    <version>2.8.9</version>

  </dependency>


  <!-- 依赖的log4j日志框架的实用组合 -->

  <dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-api</artifactId>

    <version>2.23.1</version>

  </dependency>

  <dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-core</artifactId>

    <version>2.23.1</version>

  </dependency>

  <dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-slf4j-impl</artifactId>

    <version>2.23.1</version>

  </dependency>


  <!-- 依赖的RabbitMQ中间件的java客户端库,用于与MobileIMSDK-Web产品进行消息互通时 -->

  <dependency>

    <groupId>com.rabbitmq</groupId>

    <artifactId>amqp-client</artifactId>

    <version>5.20.0</version>

  </dependency>


  <!-- 依赖的netty库 -->

  <dependency>

    <groupId>io.netty</groupId>

    <artifactId>netty-all</artifactId>

    <version>4.1.67.Final</version>

  </dependency>


  <!-- MobileIMSDK的核心库(此jar没有上传到mave中央库,请注意本地引用路径哦) -->

  <dependency>

    <groupId>com.x52im</groupId>

    <artifactId>mobileimsdk-server</artifactId>

    <version>6.5</version>

    <scope>system</scope>

    <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/MobileIMSDKServer.jar</systemPath>

  </dependency>


</dependencies>

 以RainbowChat的Server工程为例,示例如下图:

2.3 引用lib包(Eclipse工程)

 Eclipse中如何引用第3方jar包?

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

 以MobileIMSDK Server的Demo工程为例,结果如下图:

第二部分:编写代码

第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系列方法即可,详见下图:

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

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

如下图所示:从 Github 或 淘宝 得到的核心库工程和Demo演示工程

(▲ 左边为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包:

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

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

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

证书文件就像这样:

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

2 代码中启用SSL/TLS加密

* 将准备好的证书放置到服务端工程的此目录下(以MobileIMSDK的服务端Demo工程为例):

* 启用SSL/TLS配置(取消此行代码注释即可):

* 启用SSL/TLS后的运行效果(服务端控制台log中出现此字样即表示SSL/TLS启用成功!):

(▲ 服务端启动时控制台下关于已开启TLS/SSL加密的log输出(run.bat运行时))

(▲ 服务端启动时控制台下关于已开启TLS/SSL加密的log输出(IDEA中运行时))

(▲ 客户端发起WebSocket连接时,服务端控制台下带有TLS/SSL信息的握手log)

内容参考自:http://www.52im.net/thread-63-1-1.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容