默认

本文目录

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

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

写在前面


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

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

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

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

第一部分:集成准备


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


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

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

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


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


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


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

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

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工程为例,示例如下图:
即时通讯框架MobileIMSDK的开发指南:Server端_2.png

2.3引用lib包(Eclipse工程)


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

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

第二部分:编写代码


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


① 框架基本事件回调实现类:
public class ServerEventListenerImpl implements ServerEventListener
{
    private static Logger logger = LoggerFactory.getLogger(ServerEventListenerImpl.class);
    /**
     * 用户身份验证回调方法定义(即验证客户端连接的合法性,合法就允许正常能信,否则断开).
     * <p>
     * 服务端的应用层可在本方法中实现用户登陆验证。
     * 
     * @param userId 传递过来的准一id,保证唯一就可以通信,可能是登陆用户名、也可能是任意不重复的id等,具体意义由业务层决定
     * @param token 用于身份鉴别和合法性检查的token,它可能是登陆密码,也可能是通过前置单点登陆接口拿到的token等,具体意义由业务层决定
     * @param extra 额外信息字符串。本字段目前为保留字段,供上层应用自行放置需要的内容
     * @param session 此客户端连接对应的 netty “会话”
     * @return 0 表示登陆验证通过,否则可以返回用户自已定义的错误码,错误码值应为:>=1025的整数
     */
    @Override
    public int onUserLoginVerify(String userId, String token, String extra, Channel session)
    {
        logger.debug("【DEBUG_回调通知】正在调用回调方法:OnVerifyUserCallBack...(extra=" + extra + ")");
        return 0;
    }
    /**
     * 用户登录验证成功后的回调方法定义(在业务上可理解为该用户的上线通知).
     * <p>
     * 服务端的应用层通常可在本方法中实现用户上线通知等。
     * 
     * @param userId 传递过来的准一id,保证唯一就可以通信,可能是登陆用户名、也可能是任意不重复的id等,具体意义由业务层决定
     * @param extra 额外信息字符串。本字段目前为保留字段,供上层应用自行放置需要的内容。为了丰富应用层处理的手段,在本回调中也把此字段传进来了
     * @param session 此客户端连接对应的 netty “会话”
     */
    @Override
    public void onUserLoginSucess(String userId, String extra, Channel session)
    {
        logger.debug("【IM_回调通知onUserLoginSucess】用户:" + userId + " 上线了!");
    }
    /**
     * 用户退出登录回调方法定义(可理解为下线通知回调)。
     * <p>
     * 服务端的应用层通常可在本方法中实现用户下线通知等。
     * 
     * @param userId 下线的用户user_id
     * @param session 此客户端连接对应的 netty “会话”
     * @param beKickoutCode 被踢原因编码,本参数当为-1时表示本次logout事件不是源自“被踢”,否则被踢原因编码请见 {@link PKickoutInfo}类中的常量定义
     * @see {@link OnlineProcessor#setBeKickoutCodeForChannel(Channel, int)}
     */
    @Override
    public void onUserLogout(String userId, Channel session, int beKickoutCode)
    {
        logger.debug("【DEBUG_回调通知onUserLogout】用户:" + userId + " 离线了(beKickoutCode=" + beKickoutCode + ")!");
    }
    /**
     * 收到客户端发送给“服务端”的数据回调通知(即:消息路径为“C2S”的消息)前的处理逻辑。
     * 
     * @param p 消息/指令的完整协议包对象
     * @param session 消息发送者的“会话”引用(也就是客户端的网络连接对象)
     * @return true表示经过本方法后将正常进入 {@link #onTransferMessage4C2S(Protocal, Channel)}继续正常逻辑  ,false表示该条指令将不会继续处理(直接被丢弃)
     * @see #onTransferMessage4C2S(Protocal, Channel)
     * @since 6.2
     */
    @Override
    public boolean onTransferMessage4C2CBefore(Protocal p, Channel session)
    {
        return true;
    }
    /**
     * 收到客户端发送给“其它客户端”的数据回调通知(即:消息路径为“C2C”的消息)前的处理逻辑。
     * 
     * @param p 消息/指令的完整协议包对象
     * @param session 消息发送者的“会话”引用(也就是客户端的网络连接对象)
     * @return true表示经过本方法后将正常进入 {@link #onTransferMessage4C2C(Protocal)}继续正常逻辑  ,false表示该条指令将不会继续处理(直接被丢弃)
     * @see #onTransferMessage4C2C(Protocal)
     * @since 6.2
     */
    @Override
    public boolean onTransferMessage4C2SBefore(Protocal p, Channel session)
    {
        return true;
    }
    /**
     * 收到客户端发送给“服务端”的数据回调通知(即:消息路径为“C2S”的消息).
     * 
     * @param p 消息/指令的完整协议包对象
     * @param session 此客户端连接对应的 netty “会话”
     * @return true表示本方法已成功处理完成,否则表示未处理成功。此返回值目前框架中并没有特殊意义,仅作保留吧
     * @see Protocal
     * @since 4.0
     */
    @Override
    public boolean onTransferMessage4C2S(Protocal p, Channel session)
    {
        // 接收者uid
        String userId = p.getTo();
        // 发送者uid
        String from_user_id = p.getFrom();
        // 消息或指令内容
        String dataContent = p.getDataContent();
        // 消息或指令指纹码(即唯一ID)
        String fingerPrint = p.getFp();
        // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
        int typeu = p.getTypeu();
        logger.debug("【DEBUG_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给服务端的消息:str=" + dataContent);
        return true;
    }
    /**
     * 收到客户端发送给“其它客户端”的数据回调通知(即:消息路径为“C2C”的消息).
     * 
     * @param p 消息/指令的完整协议包对象
     * @see Protocal
     * @since 4.0
     */
    @Override
    public void onTransferMessage4C2C(Protocal p)
    {
        // 接收者uid
        String userId = p.getTo();
        // 发送者uid
        String from_user_id = p.getFrom();
        // 消息或指令内容
        String dataContent = p.getDataContent();
        // 消息或指令指纹码(即唯一ID)
        String fingerPrint = p.getFp();
        // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
        int typeu = p.getTypeu();
        logger.debug("【DEBUG_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给客户端" + userId + "的消息:str=" + dataContent);
    }
    /**
     * 服务端在进行消息发送时,当对方在线但实时发送失败、以及其它各种问题导致消息并没能正常发出时,将无条件走本回调通知。
     * 
     * 
     * @param p 消息/指令的完整协议包对象
     * @return true表示应用层已经处理了离线消息,否则表示应用层没有处理
     * @see Protocal
     * @see #onTransferMessage4C2C(Protocal)
     * @since 4.0
     */
    @Override
    public boolean onTransferMessage_RealTimeSendFaild(Protocal p)
    {
        // 接收者uid
        String userId = p.getTo();
        // 发送者uid
        String from_user_id = p.getFrom();
        // 消息或指令内容
        String dataContent = p.getDataContent();
        // 消息或指令指纹码(即唯一ID)
        String fingerPrint = p.getFp();
        // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
        int typeu = p.getTypeu();
        logger.debug("【DEBUG_回调通知】[typeu=" + typeu + "]客户端" + from_user_id + "发给客户端" + userId + "的消息:str=" + dataContent + ",因实时发送没有成功,需要上层应用作离线处理哦,否则此消息将被丢弃.");
        return false;
    }
    /**
     * <b>注意:</b><font color="red">本回调仅用于与Web的互通模式下,默认情况下本方法可什么也不做,无任何影响。如你对此回调有疑问可跟Jack Jiang进行技术讨论!</font>
     * {@inheritDoc}
     * 
     * @since 6.2
     */
    @Override
    public void onTransferMessage4C2C_AfterBridge(Protocal p)
    {
        // 默认本方法可
    }
}

② 服务端主动发起消息的QoS回调通知实现类:
public class MessageQoSEventS2CListnerImpl implements MessageQoSEventListenerS2C
{
    private static Logger logger = LoggerFactory.getLogger(MessageQoSEventS2CListnerImpl.class);
    /**
     * 消息未送达的回调事件通知.
     * 
     * @param lostMessages 由MobileIMSDK QoS算法判定出来的未送达消息列表(此列表
     * 中的Protocal对象是原对象的clone(即原对象的深拷贝),请放心使用哦),应用层
     * 可通过指纹特征码找到原消息并可以UI上将其标记为”发送失败“以便即时告之用户
     */
    @Override
    public void messagesLost(ArrayList < Protocal > lostMessages)
    {
        logger.debug("【DEBUG_QoS_S2C事件】收到系统的未实时送达事件通知,当前共有" + lostMessages.size() + "个包QoS保证机制结束,判定为【无法实时送达】!");
    }
    /**
     * 消息已被对方收到的回调事件通知.
     * <p>
     * <b>目前,判定消息被对方收到是有两种可能:</b><br>
     * 1) 对方确实是在线并且实时收到了;<br>
     * 2) 对方不在线或者服务端转发过程中出错了,由服务端进行离线存储成功后的反馈
     * (此种情况严格来讲不能算是“已被收到”,但对于应用层来说,离线存储了的消息
     * 原则上就是已送达了的消息:因为用户下次登陆时肯定能通过HTTP协议取到)。
     * 
     * @param theFingerPrint 已被收到的消息的指纹特征码(唯一ID),应用层可据此ID
     * 来找到原先已发生的消息并可在UI是将其标记为”已送达“或”已读“以便提升用户体验
     */
    @Override
    public void messagesBeReceived(String theFingerPrint)
    {
        if(theFingerPrint != null)
        {
            logger.debug("【DEBUG_QoS_S2C事件】收到对方已收到消息事件的通知,fp=" + theFingerPrint);
        }
    }
}

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

public class ServerLauncherImpl extends ServerLauncher
{
    private static Logger logger = LoggerFactory.getLogger(ServerLauncherImpl.class);

    /**
     * 静态类方法:进行一些全局配置设置。
     */
    static
    {
        // 设置MobileIMSDK服务端的UDP网络监听端口
        GatewayUDP.PORT = 7901;
        // 设置MobileIMSDK服务端的TCP网络监听端口
        GatewayTCP.PORT = 8901;
        // 设置MobileIMSDK服务端的WebSocket网络监听端口
        GatewayWebsocket.PORT = 3000;
        // 设置MobileIMSDK服务端同时支持UDP、TCP、WebSocket三种协议
        ServerLauncher.supportedGateways = Gateway.SOCKET_TYPE_UDP | Gateway.SOCKET_TYPE_TCP | Gateway.SOCKET_TYPE_WEBSOCKET;
        // 开/关Demog日志的输出
        QoS4SendDaemonS2C.getInstance().setDebugable(true);
        QoS4ReciveDaemonC2S.getInstance().setDebugable(true);
        // 与客户端协商一致的心跳频率模式设置
        ServerToolKits.setSenseModeTCP(SenseModeTCP.MODE_5S);
        ServerToolKits.setSenseModeWebsocket(SenseModeWebsocket.MODE_5S);
        // 关闭与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;
        SslContext sslContext = createSslContext();
        // 开启TCP协议的SSL/TLS加密传输(请确保客户端也已开发SSL)
//     GatewayTCP.sslContext = sslContext;
        // 开启WebSocket协议的SSL/TLS加密传输(请确保SSL证书是正规CA签发,否则浏览器是不允许的)
//     GatewayWebsocket.sslContext = sslContext;
    }

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

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

    /**
     * 创建SslContext对象,用于开启SSL/TLS加密传输。
     * 
     * @return 如果成功创建则返回SslContext对象,否则返回null
     */
    private static SslContext createSslContext()
    {
        try
        {
            /** 示例 2:使用证书(证书位于相对路径)*/
            // TODO: 注意:请使用自已的证书,Demo中带的证书为自签名证书且已绑定域名,不安全!!!
            // 证书文件
            InputStream certChainFile = ServerLauncherImpl.class.getResourceAsStream("certs/netty-cert2.crt");
            // 私钥文件(注意:Netty只支持.pk8格式,如何生成,见JackJiang文章:)
            InputStream keyFile = ServerLauncherImpl.class.getResourceAsStream("certs/netty-key2.pk8");
            // 私钥密码(注意:Netty只支持.pk8格式,如何生成,见JackJiang文章:)
            String keyPassword = "123456";
            // 生成SslContext对象(为了方便理解,此处使用的是单向认证)
            SslContext sslCtx = SslContextBuilder.forServer(certChainFile, keyFile, keyPassword).clientAuth(ClientAuth.NONE).build();
            return sslCtx;
        }
        catch (Exception e)
        {
            logger.warn("createSslContext()时出错了,原因:" + e.getMessage(), e);
        }
        return null;
    }

    /**
     * Demo程序主入口函数。
     * 
     * @param args
     * @throws Exception
     */
    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端_3.png

* 启用SSL/TLS后的运行效果服务端控制台log中出现此字样即表示SSL/TLS启用成功!):
即时通讯框架MobileIMSDK的开发指南:Server端_5.png
▲ 服务端启动时控制台下关于已开启TLS/SSL加密的log输出(run.bat运行时

即时通讯框架MobileIMSDK的开发指南:Server端_1111.png
▲ 服务端启动时控制台下关于已开启TLS/SSL加密的log输出(IDEA中运行时

即时通讯框架MobileIMSDK的开发指南:Server端_2222.png
▲ 客户端发起WebSocket连接时,服务端控制台下带有TLS/SSL信息的握手log


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


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


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

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

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

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

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

推荐方案
评论 39

补充说明一下:
【附录2】里给出的方法,可以让开发者实现自已的user id策略(MobileIMSDK默认是生成一个递增的整数),而开发者可以根据用户名等信息返回固定值(比如存放于DB中的id主键)等,总之API可以灵活使用,就看怎么去构思了。
感谢楼主分享
感谢楼主分享

感谢楼主分享
签名: 该会员没有填写今日想说内容.
感谢楼主分享
这两天在学习服务端中,有个问题是:设置的AppKey应该没有用吧
这个是准备预留做客户端的AppKey校验吗?
引用:1726013735 发表于 2017-09-01 11:53
感谢楼主分享
这两天在学习服务端中,有个问题是:设置的AppKey应该没有用吧
这个是准备预留做客户端的AppK ...

AppKey暂时只是保留字段,你不用理会它就好了。
楼主您好,这个MobileIMSDK数据传输协议Protocal里面的dataContent是字符型,传文件什么的要改这个协议吧?实时音视频可以直接用这个服务端的SDK吗?
引用:1536155320 发表于 2018-01-24 17:31
楼主您好,这个MobileIMSDK数据传输协议Protocal里面的dataContent是字符型,传文件什么的要改这个协议吧? ...

现在谁还用实时通道来传文件啊,你看看这个帖子,里面讨论了现在移动端im的文件上传和下载实现方法:
请问有人知道语音留言聊天的主流实现方式吗?
感谢感谢,学习了
精编版的 demo  netty  提示无法加载主类是什么情况,门外汉多包涵

FDF3BA32-A760-4e16-A04F-BEFACDB96888.png (26.82 KB, 下载次数: 4630)

提示

提示
引用:jqshan 发表于 2018-11-13 16:58
精编版的 demo  netty  提示无法加载主类是什么情况,门外汉多包涵

你至少要能在你的电脑上跑一个最普通的java hello world吧。
附录2的自定义生成用户id的方法getNextUserId不存在啊
引用:xiaoweiqb 发表于 2018-12-28 01:48
附录2的自定义生成用户id的方法getNextUserId不存在啊

这个方法是MobileIMSDK V2版里的,V3版已经不存在这个方法了,也不需要这个方法。
楼主请问,这个服务端MobileIMSDK 可以部署多个并进行连接吗,并且跨集群行吗
签名: 来至普宁南溪镇,去往我也不知道的前方 *_*
引用:小小搬码工 发表于 2019-02-26 14:58
楼主请问,这个服务端MobileIMSDK 可以部署多个并进行连接吗,并且跨集群行吗

默认是不行的。
引用:JackJiang 发表于 2019-02-26 15:05
默认是不行的。

那改下代码就可以的吗
签名: 来至普宁南溪镇,去往我也不知道的前方 *_*
引用:JackJiang 发表于 2019-02-26 15:05
默认是不行的。

是有预留这方方面的实现吗
签名: 来至普宁南溪镇,去往我也不知道的前方 *_*
引用:小小搬码工 发表于 2019-02-26 15:13
是有预留这方方面的实现吗

代码里跟MobileIMSDK-Web互通的部分,其实相当于集群的雏形。但要开发完整的集群,显示代码只是一方面。不过MobileIMDDK以后会有集群版。

你是打算开发什么应用?用户量很大吗?你可以看看MobileIMSDK的性能报告:http://www.52im.net/thread-57-1-1.html,一般的应用规模足够用了
引用:JackJiang 发表于 2019-02-26 16:31
代码里跟MobileIMSDK-Web互通的部分,其实相当于集群的雏形。但要开发完整的集群,显示代码只是一方面。 ...

其实主要应用的范围比较广,就是差不多是全球的,一台服务器有些范围覆盖不到,通信会差,所以打算在不同地区部署几台,进行连接
签名: 来至普宁南溪镇,去往我也不知道的前方 *_*
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部