Watch Star Fork

远方夕阳 / cimJava

加入码云
与超过 300 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
基于Java服务端的即时通信解决方案,与android 客户端完美结合,同时支持其他语言的移动应用,物联网,智能家居,桌面应用,WEB应用以及后台系统之间的即时消交互,为你解决了长连接各种消息事件,断线重连等繁琐的处理,使用方便易于集成。
一键复制 编辑 原始数据 按行查看 历史
README.md 6.40 KB 远方夕阳 提交于 2018-02-05 18:00 . no message

说明:

此开源版本为基础功能版本,只有消息推送的基础功能!netty版本,和mina版本结构和功能完全一致,大家可以选择自己喜欢的或者合适的版本学习或者使用!

侣信专业版2.5.0版本发布

http://farsunset.com

前言:

现在市面上有很多 xmpp协议的即时通讯方案,openfire androidpn,等等。它们都是使用了apache mina开发,但是这些东西基本都需要二次改造开发。而且改动还很大,我也看过这些东西的源码,发现代码结构不太理想,耦合的情况太多,实在不好扩展。所谓XMPP 协议。只不过是别人使用mina 自定义了一个消息编码解码协议。通俗的讲就是,xml形式消息的编码与解码,我们完全没有必要在国外这套不成熟的openfire 与xmpp 上耗费过多的精力去研究,我们完全可以通过apache mina 自定义自己的通讯协议,并可以为它使用自己的名字。我们不要盲目崇拜国外的有些东西,自己掌握原理,才是最重要的,各位切记~

这套IM系统为我个人自主开发 使用了 apache mina ,主要功能为 服务端和客户端,客户端 到客户端的即时通信,可以支持包括文字 图片,语音等任何消息形式 服务端使用的 struts2+spring3和 apache mina android端 也使用的apache mina。这套IM系统结构还是非常清晰合理的,非常容易扩展和改造,下面是android版本 的 demo的目的是只是一个演示 ,可以参照它的代码,使用这套系统开发自己的东西,核心价值是一套高灵活性,相对标准化的即时通讯解决方案,即时聊天只是它的一种运用途径!

服务端集群配置方案

服务端修改

1.多台服务器集群配置,首先需要重写SessionManager接口(参考com.farsunset.ichat.cim.session.ClusterSessionManager.java),用户登录时,将账号和服务器IP 存入数据库中,这样就可以统计各台服务器接受的连接数量。 2.客户端连接服务器时,服务端为客户端动态分配 服务器IP,每次分配 较为空闲的服务器IP 3.服务端接受消息后 通过接收者账号查询出对应的Iosession,和 登录的 服务器IP,然后将消息信息传往目标服务器处理发送

客户端端修改

1.客户端登录时将不在是固定的服务器IP 而是先通过http接口获取到当前空闲的服务器IP,然后登录

成功案例

http://blog.csdn.net/xx753277/article/details/17512255

http://blog.csdn.net/xx753277/article/details/45535981

客户端接收消息

image

服务端消息 web入口

http://192.168.1.11:8080/ichat-server

image

常用功能接口

所有开放外部接口都集中在 com.farsunset.cim.client.android.CIMPushManager

1.1连接服务器

/**
* 初始化,连接服务端,在程序启动页或者 在Application里调用
* @param context
* @param ip
* @param port
*/
public static  void connect(Context context,String ip,int port)

//示例
CIMPushManager.connect(context,"125.12.35.231",28888);

1.2绑定账号到服务端

/**
* 设置一个账号登录到服务端
* @param account 用户唯一ID
*/
public static  void bindAccount(Context context,String account)

//示例
CIMPushManager.bindAccount(context,"xiyang");


1.3发送一个CIM请求

酌情使用此功能,可用http接口替代

/**
* 发送一个CIM请求
* @param context 
* @param body  请求体的结构
*/
public static  void sendRequest(Context context,SentBody body)

//示例:获取离线消息
SentBody sent = new SentBody();
sent.setKey(CIMConstant.RequestKey.CLIENT_OFFLINE_MESSAGE);
sent.put("account", "xiyang");
CIMPushManager.sendRequest(context, sent);

//该功能需要服务端实现,详情参考服务端PullOflineMessageHandler.java

1.4停止接收消息

/**
* 停止接受推送,将会退出当前账号登录,端口与服务端的连接
* @param context
*/
public static  void stop(Context context)
//示例:
CIMPushManager.stop(context);    
      

1.5恢复接收消息

/**
* 重新恢复接收推送,重新连接服务端,并登录当前账号
* @param context
*/
public static  void resume(Context context)
//示例:
CIMPushManager.resume(context);    

1.6完全销毁连接

/**
* 完全销毁CIM,一般用于完全退出程序,调用resume将不能恢复
* @param context
*/
public static  void destroy(Context context)
//示例:
CIMPushManager.destroy(context);    


1.7获取是否与服务端连接正常

/**
 *  
 * @param context
 */
public boolean isConnected(Context context)   

//示例:
CIMPushManager.isConnected(context);   

1.8获取PushManager状态

//被销毁的destroy()
CIMPushManager.STATE_DESTROYED = 0x0000DE;
//被销停止的 stop()
CIMPushManager.STATE_STOPED = 0x0000EE;
	
CIMPushManager.STATE_NORMAL = 0x000000;
	
public int getState(Context context)   

//示例:
CIMPushManager.getState(context);   

1.9推送消息以及相关事件的接收

首先注册一个广播,并监听以下action 参照 后面androidManifest.xml配置

参考CustomCIMMessageReceiver的实现

/**
* 当收到服务端推送过来的消息时调用
* @param message
*/
public abstract void onMessageReceived(Message message);

/**
* 当调用CIMPushManager.sendRequest()向服务端发送请求,获得相应时调用
* @param replybody
*/
public abstract void onReplyReceived(ReplyBody replybody);

/**
* 当手机网络发生变化时调用
* @param networkinfo
*/
public abstract void onNetworkChanged(NetworkInfo networkinfo);
    
/**
* 当连接服务器成功时回调
* @param hasAutoBind  : true 已经自动绑定账号到服务器了,不需要再手动调用bindAccount
*/
public abstract void onConnectionSuccessed(boolean hasAutoBind);
    
/**
* 当断开服务器连接的时候回调
*/
public abstract void onConnectionClosed();
    
/**
* 当服务器连接失败的时候回调
* 
*/
public abstract void onConnectionFailed(Exception e);

评论 ( 0 )

你可以在登录后,发表评论