请选择 进入手机版 | 继续访问电脑版

默认
打赏 发表评论 22
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
即时通讯框架MobileIMSDK的开发指南:Server端
学习交流↘
  • 常见问题讨论学习:点此进入 推荐
  • 讨论学习和资料区:点此进入
  • 移动端即时通讯交流群: 320837163 推荐
  • bug/建议发送至:jb2011@163.com
  • 技术支持/合作/咨询请联系作者QQ:413980957

相关资料↘

开发文档↘

资源下载↘

相关技术↘
  ① Web端即时通讯框架:MobileIMSDK-Web
  ② 移动端实时音视频框架:RainbowAV
  ③ 全功能产品级IM案例:RainbowChat
  ④ Web端产品级IM案例:RainbowChat-Web

写在前面


MobileIMSDK的Server端Demo工程演示了一个简易即时通讯服务端,相关代码和最佳实践可参考之,它位于SDK完整下载包的 src_all/server/MobileIMSDKServer/ 目录下,这是一个完整的Eclipse工程。您也可以下载编译好的Demo安装包先行体验:它位于SDK完整下载包的 demos/server/ 目录下。

第一部分:集成准备


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


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

找到lib包:
位于SDK完整下载包的 dist/server/ 目录下:
QQ20151119-0.png

第2步:引用lib包

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


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

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

第二部分:编写代码


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


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

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

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

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

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

    // 通用数据实时发送失败后的回调函数定义(客户端发给客户端的(即接收user_id>0))
    // 开发者可在此方法中处理离线消息的保存等。详细请参见API文档说明。
    @Override
    public boolean onTransBuffer_C2C_RealTimeSendFaild_CallBack(int userId,
                int from_user_id, String dataContent, String fingerPring)
    {
        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
{
    private static ServerLauncherImpl instance = null;
        
    public static ServerLauncherImpl getInstance() throws IOException
    {
        if(instance == null)
        {
            // 设置AppKey
            ServerLauncher.appKey = "5418023dfd98c579b6001741";
            QoS4SendDaemonS2C.DEBUG = true;
            ServerLauncherImpl.PORT = 7901;
//          ServerLauncherImpl.setSenseMode(SenseMode.MODE_10S);
            instance = new ServerLauncherImpl();
        }
        return instance; 
    }
        
    public ServerLauncherImpl() throws IOException
    {
        super();
    }
        
    /**
     * 初始化消息处理事件监听者.
     */
    @Override
    protected void initListeners()
    {
        // ** 设置回调
        this.setServerEventListener(new ServerEventListenerImpl());
        this.setServerMessageQoSEventListener(new MessageQoSEventS2CListnerImpl());
    }
        
    public static void main(String[] args) throws IOException 
    {
        ServerLauncherImpl.getInstance().startup();
    }
}

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


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

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


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

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

附录2:如何自定义UserId的生成?(注意:此条仅针对v2.x版)


重写方法 ServerLauncher. initServerCoreHandler() 即可,以Demo中的代码为例:
public class ServerLauncherImpl extends ServerLauncher
{
    private static ServerLauncherImpl instance = null;
        
    public static ServerLauncherImpl getInstance() throws IOException
    {
        if(instance == null)
        {
            ServerLauncher.appKey = "5418023dfd98c579b6001741";
            QoS4SendDaemonS2C.DEBUG = true;
            ServerLauncherImpl.PORT = 7901;
            ServerLauncherImpl.setSenseMode(SenseMode.MODE_3S);

            instance = new ServerLauncherImpl(){
                 @Override
                 protected ServerCoreHandler initServerCoreHandler()
                 {
                      return new ServerCoreHandler(){
                           // 【注意】:重写此方法来实现您自已的user id生成算法哦^_^!
                           @Override
                           protected int getNextUserId(PLoginInfo loginInfo)
                           {
                              return UserProcessor.nextUserId(loginInfo);
                           }
                      };
                  }
             };
        }
        return instance; 
    }
        
    public ServerLauncherImpl() throws IOException
    {
        super();
    }
        
    @Override
    protected void initListeners()
    {
        this.setServerEventListener(new ServerEventListenerImpl());
        this.setServerMessageQoSEventListener(new MessageQoSEventS2CListnerImpl());
    }
        
    public static void main(String[] args) throws IOException 
    {
        ServerLauncherImpl.getInstance().startup();
    }
}
补充说明:重新实现以上代码中的第 23 行即可哦。

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


Mina版和Netty服务端都是使用 LocalSendHelper 类中的sendData系列方法即可,详见下图:
mina.png

Mina版服务端的API文档地址:http://docs.52im.net/extend/docs/api/mobileimsdk/server/
Netty版服务端的API文档地址:http://docs.52im.net/extend/docs/api/mobileimsdk/server_netty/

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


如下图所示:Github淘宝 得到的核心库工程和Demo演示工程
3.jpg
▲ 左边为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.jpg


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


请点击需要的平台和版本,前往淘宝下单,付款后系统会自动发货(网盘下载链接)到您的相关邮件地址,详情请见淘宝详情:

MobileIMSDK(Android客户端库)精编注释版:https://item.taobao.com/item.htm?id=534778878908
MobileIMSDK(Java客户端库)精编注释版:https://item.taobao.com/item.htm?id=534874027509
MobileIMSDK(iOS客户端库)精编注释版:https://item.taobao.com/item.htm?id=534918179776
MobileIMSDK(服务端库)精编注释版:https://item.taobao.com/item.htm?id=534986485062


1.png       2.png
3.png       4.png

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

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

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

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

推荐方案
评论 22

补充说明一下:
【附录2】里给出的方法,可以让开发者实现自已的user id策略(MobileIMSDK默认是生成一个递增的整数),而开发者可以根据用户名等信息返回固定值(比如存放于DB中的id主键)等,总之API可以灵活使用,就看怎么去构思了。
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
感谢楼主分享
感谢楼主分享

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

AppKey暂时只是保留字段,你不用理会它就好了。
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
楼主您好,这个MobileIMSDK数据传输协议Protocal里面的dataContent是字符型,传文件什么的要改这个协议吧?实时音视频可以直接用这个服务端的SDK吗?
引用:1536155320 发表于 2018-01-24 17:31
楼主您好,这个MobileIMSDK数据传输协议Protocal里面的dataContent是字符型,传文件什么的要改这个协议吧? ...

现在谁还用实时通道来传文件啊,你看看这个帖子,里面讨论了现在移动端im的文件上传和下载实现方法:
请问有人知道语音留言聊天的主流实现方式吗?
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
感谢感谢,学习了
精编版的 demo  netty  提示无法加载主类是什么情况,门外汉多包涵

提示

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

你至少要能在你的电脑上跑一个最普通的java hello world吧。
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
附录2的自定义生成用户id的方法getNextUserId不存在啊
引用:xiaoweiqb 发表于 2018-12-28 01:48
附录2的自定义生成用户id的方法getNextUserId不存在啊

这个方法是MobileIMSDK V2版里的,V3版已经不存在这个方法了,也不需要这个方法。
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
楼主请问,这个服务端MobileIMSDK 可以部署多个并进行连接吗,并且跨集群行吗
签名: 来至普宁南溪镇,去往我也不知道的前方 *_*
引用:小小搬码工 发表于 2019-02-26 14:58
楼主请问,这个服务端MobileIMSDK 可以部署多个并进行连接吗,并且跨集群行吗

默认是不行的。
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
引用: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,一般的应用规模足够用了
签名: 《正确理解IM长连接的心跳及重连机制,并动手实现》:http://www.52im.net/thread-2799-1-1.html
引用:JackJiang 发表于 2019-02-26 16:31
代码里跟MobileIMSDK-Web互通的部分,其实相当于集群的雏形。但要开发完整的集群,显示代码只是一方面。 ...

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

返回顶部