Update README.md

This commit is contained in:
远方夕阳 2014-06-26 12:04:22 +08:00
parent dfb3769c40
commit eadec2c6a8

337
README.md
View File

@ -1,168 +1,171 @@
#前言 #说明:此开源版本为基础功能版本,只有消息推送的基础功能!
现在市面上有很多 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的目的是只是一个演示 ,可以参照它的代码,使用这套系统开发自己的东西,核心价值是一套高灵活性,相对标准化的即时通讯解决方案,即时聊天只是它的一种运用途径!
现在市面上有很多 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.多台服务器集群配置首先需要重写SessionManager接口(参考com.farsunset.ichat.cim.session.ClusterSessionManager.java)用户登录时将账号和服务器IP 存入数据库中,这样就可以统计各台服务器接受的连接数量。
2.客户端连接服务器时,服务端为客户端动态分配 服务器IP每次分配 较为空闲的服务器IP
###客户端端修改 3.服务端接受消息后 通过接收者账号查询出对应的Iosession和 登录的 服务器IP然后将消息信息传往目标服务器处理发送
1.客户端登录时将不在是固定的服务器IP 而是先通过http接口获取到当前空闲的服务器IP然后登录
#成功案例 ###客户端端修改
#http://www.eoeandroid.com/thread-300586-1-1.html 1.客户端登录时将不在是固定的服务器IP 而是先通过http接口获取到当前空闲的服务器IP然后登录
#成功案例
#http://www.eoeandroid.com/thread-300586-1-1.html
##客户端接收消息
![image](http://staticres.oss-cn-hangzhou.aliyuncs.com/cim-android_client.png)
##服务端消息 web入口 ##客户端接收消息
#http://192.168.1.11:8080/ichat-server ![image](http://staticres.oss-cn-hangzhou.aliyuncs.com/cim-android_client.png)
![image](http://staticres.oss-cn-hangzhou.aliyuncs.com/cim-server.png) ##服务端消息 web入口
#http://192.168.1.11:8080/ichat-server
![image](http://staticres.oss-cn-hangzhou.aliyuncs.com/cim-server.png)
##常用功能接口
所有开放外部接口都集中在
com.farsunset.cim.client.android.CIMPushManager
```java ##常用功能接口
所有开放外部接口都集中在
1.1连接服务器 com.farsunset.cim.client.android.CIMPushManager
/** ```java
* 初始化,连接服务端,在程序启动页或者 在Application里调用
* @param context 1.1连接服务器
* @param ip /**
* @param port * 初始化,连接服务端,在程序启动页或者 在Application里调用
*/ * @param context
public static void init(Context context,String ip,int port) * @param ip
* @param port
示例 */
CIMPushManager.init(context,"125.12.35.231",28888); public static void init(Context context,String ip,int port)
示例
CIMPushManager.init(context,"125.12.35.231",28888);
1.2绑定账号到服务端
/**
* 设置一个账号登录到服务端
* @param account 用户唯一ID 1.2绑定账号到服务端
*/ /**
public static void setAccount(Context context,String account) * 设置一个账号登录到服务端
* @param account 用户唯一ID
示例 */
CIMPushManager.setAccount(context,"xiyang"); public static void setAccount(Context context,String account)
示例
CIMPushManager.setAccount(context,"xiyang");
1.3发送一个CIM请求
酌情使用此功能可用http接口替代
/** 1.3发送一个CIM请求
* 发送一个CIM请求 酌情使用此功能可用http接口替代
* @param context
* @param ip /**
* @param port * 发送一个CIM请求
*/ * @param context
public static void sendRequest(Context context,SentBody body) * @param ip
* @param port
示例:获取离线消息 */
SentBody sent = new SentBody(); public static void sendRequest(Context context,SentBody body)
sent.setKey(CIMConstant.RequestKey.CLIENT_OFFLINE_MESSAGE);
sent.put("account", "xiyang"); 示例:获取离线消息
CIMPushManager.sendRequest(context, sent); SentBody sent = new SentBody();
sent.setKey(CIMConstant.RequestKey.CLIENT_OFFLINE_MESSAGE);
该功能需要服务端实现详情参考CIM服务端及辅助文档.doc > 1.2.3 sent.put("account", "xiyang");
CIMPushManager.sendRequest(context, sent);
该功能需要服务端实现详情参考CIM服务端及辅助文档.doc > 1.2.3
1.4停止接收消息
/**
* 停止接受推送,将会退出当前账号登录,端口与服务端的连接 1.4停止接收消息
* @param context
*/ /**
public static void stop(Context context) * 停止接受推送,将会退出当前账号登录,端口与服务端的连接
示例: * @param context
CIMPushManager.stop(context); */
public static void stop(Context context)
示例:
CIMPushManager.stop(context);
1.5恢复接收消息
/**
* 重新恢复接收推送,重新连接服务端,并登录当前账号 1.5恢复接收消息
* @param context
*/ /**
public static void resume(Context context) * 重新恢复接收推送,重新连接服务端,并登录当前账号
示例: * @param context
CIMPushManager.resume(context); */
public static void resume(Context context)
示例:
CIMPushManager.resume(context);
1.6完全销毁连接
/**
* 完全销毁CIM一般用于完全退出程序调用resume将不能恢复 1.6完全销毁连接
* @param context
*/ /**
public static void destory(Context context) * 完全销毁CIM一般用于完全退出程序调用resume将不能恢复
示例: * @param context
CIMPushManager.destory(context); */
public static void destory(Context context)
示例:
CIMPushManager.destory(context);
1.7获取是否与服务端连接正常
/**
* 异步获取与服务端连接状态,将会在广播中收到onConnectionStatusboolean f 1.7获取是否与服务端连接正常
* @param context
*/ /**
public void detectIsConnected(Context context) * 异步获取与服务端连接状态,将会在广播中收到onConnectionStatusboolean f
* @param context
示例: */
CIMPushManager.detectIsConnected(context); public void detectIsConnected(Context context)
示例:
CIMPushManager.detectIsConnected(context);
1.8推送消息以及相关事件的接收
首先注册一个广播并监听以下action 参照 后面androidManifest.xml配置
1.8推送消息以及相关事件的接收
参考CustomCIMMessageReceiver的实现
/** 首先注册一个广播并监听以下action 参照 后面androidManifest.xml配置
* 当收到消息时调用此方法
*/ 参考CustomCIMMessageReceiver的实现
public void onMessageReceived(message){} /**
* 当收到消息时调用此方法
/** */
* 当手机网络变化时调用此方法 public void onMessageReceived(message){}
* @param info
*/ /**
public void onNetworkChanged(NetworkInfo info) * 当手机网络变化时调用此方法
* @param info
*/
/** public void onNetworkChanged(NetworkInfo info)
* 当调用CIMPushManager.sendRequest()获得相应时 调用此方法
* ReplyBody.key 将是对应的 SentBody.key
* @param info /**
*/ * 当调用CIMPushManager.sendRequest()获得相应时 调用此方法
public void onReplyReceived(ReplyBody body) * ReplyBody.key 将是对应的 SentBody.key
* @param info
*/
/** public void onReplyReceived(ReplyBody body)
* 获取到是否连接到服务端
* 通过调用CIMPushManager.detectIsConnected()来异步获取
* /**
*/ * 获取到是否连接到服务端
public abstract void onConnectionStatus(boolean isConnected) * 通过调用CIMPushManager.detectIsConnected()来异步获取
*
*/
public abstract void onConnectionStatus(boolean isConnected)
``` ```