diff --git a/CIMWebBridge/bin-debug/CIMBridge.swf b/CIMWebBridge/bin-debug/CIMBridge.swf index 51a350e..90c8315 100644 Binary files a/CIMWebBridge/bin-debug/CIMBridge.swf and b/CIMWebBridge/bin-debug/CIMBridge.swf differ diff --git a/CIMWebBridge/bin-release/CIMBridge.swf b/CIMWebBridge/bin-release/CIMBridge.swf index f54bac6..21c98cd 100644 Binary files a/CIMWebBridge/bin-release/CIMBridge.swf and b/CIMWebBridge/bin-release/CIMBridge.swf differ diff --git a/CIMWebBridge/src/CIMBridge.as b/CIMWebBridge/src/CIMBridge.as index 3260eab..b9029fc 100644 --- a/CIMWebBridge/src/CIMBridge.as +++ b/CIMWebBridge/src/CIMBridge.as @@ -18,9 +18,18 @@ package internal var CIM_HOST:String = "127.0.0.1"; internal var CIM_PORT:String = "23456"; internal var socket:Socket; - internal var heartbeat_timer:Timer=new Timer(180 * 1000); internal var froceOffline :Boolean = false; internal var _sound:Sound = new Sound(new URLRequest("dingdong.mp3")); + + /** + * 服务端心跳请求命令 cmd_server_hb_request + */ + internal const CMD_HEARTBEAT_REQUEST:String="S_H_RQ"; + /** + * 客户端心跳响应命令 cmd_client_hb_response + */ + internal const CMD_HEARTBEAT_RESPONSE:String ="C_H_RS"; + public function CIMBridge() { @@ -29,7 +38,6 @@ package ExternalInterface.addCallback("getOfflineMessage",getOfflineMessage); ExternalInterface.addCallback("logout",logout); ExternalInterface.addCallback("playSound",playSound); - heartbeat_timer.addEventListener(TimerEvent.TIMER,doSendHeartbeat); ExternalInterface.call("bridgeCreationComplete"); @@ -61,7 +69,9 @@ package xml+=""+account+""; xml+=""+deviceId+""; xml+="web"; - xml+="browser"; + xml+="flash"; + xml+="2.0.0"; + xml+=""+flash.system.Capabilities.version+""; xml+=""; xml+=""; @@ -94,19 +104,10 @@ package { ExternalInterface.call("sessionCreated"); - heartbeat_timer.start(); froceOffline = false; } - - private function doSendHeartbeat(e:TimerEvent):void - { - var xml:String=""; - xml+=""; - xml+="client_heartbeat"; - xml+=""; - send(xml); - } + private function sessionClosed(event:Event):void { @@ -116,7 +117,6 @@ package { connect(CIM_HOST); } - heartbeat_timer.stop(); } private function exceptionCaught(event:Event):void{ @@ -146,6 +146,14 @@ package msg = msg.substring(0,index); } + + if(msg.toUpperCase() == CMD_HEARTBEAT_REQUEST) + { + send(CMD_HEARTBEAT_RESPONSE); + return; + } + + var xml:XML=XML(msg); var data:Object = xml as Object; if(xml.name()=="reply"){ diff --git a/CIM客户端文档.doc b/CIM客户端文档.doc index efeef27..aef5e16 100644 Binary files a/CIM客户端文档.doc and b/CIM客户端文档.doc differ diff --git a/CIM服务端及辅助文档.doc b/CIM服务端及辅助文档.doc deleted file mode 100644 index 2bcf28c..0000000 Binary files a/CIM服务端及辅助文档.doc and /dev/null differ diff --git a/README.md b/README.md index b3888e2..6b6824a 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,10 @@ com.farsunset.cim.client.android.CIMPushManager * @param ip * @param port */ - public static void init(Context context,String ip,int port) + public static void connect(Context context,String ip,int port) 示例 -CIMPushManager.init(context,"125.12.35.231",28888); +CIMPushManager.connect(context,"125.12.35.231",28888); @@ -86,7 +86,7 @@ public static void sendRequest(Context context,SentBody body) sent.put("account", "xiyang"); CIMPushManager.sendRequest(context, sent); -该功能需要服务端实现,详情参考CIM服务端及辅助文档.doc > 1.2.3 +该功能需要服务端实现,详情参考服务端PullOflineMessageHandler.java @@ -120,54 +120,74 @@ public static void sendRequest(Context context,SentBody body) * 完全销毁CIM,一般用于完全退出程序,调用resume将不能恢复 * @param context */ - public static void destory(Context context) + public static void destroy(Context context) 示例: - CIMPushManager.destory(context); + CIMPushManager.destroy(context); 1.7获取是否与服务端连接正常 /** - * 异步获取与服务端连接状态,将会在广播中收到onConnectionStatus(boolean f) + * * @param context */ - public void detectIsConnected(Context context) + public boolean isConnected(Context context) 示例: - CIMPushManager.detectIsConnected(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.8推送消息以及相关事件的接收 +1.9推送消息以及相关事件的接收 首先注册一个广播,并监听以下action 参照 后面androidManifest.xml配置 参考CustomCIMMessageReceiver的实现 /** - * 当收到消息时调用此方法 - */ - public void onMessageReceived(message){} - - /** - * 当手机网络变化时调用此方法 - * @param info + * 当收到服务端推送过来的消息时调用 + * @param message */ - public void onNetworkChanged(NetworkInfo info) - + public abstract void onMessageReceived(Message message); /** - * 当调用CIMPushManager.sendRequest()获得相应时 调用此方法 - * ReplyBody.key 将是对应的 SentBody.key - * @param info + * 当调用CIMPushManager.sendRequest()向服务端发送请求,获得相应时调用 + * @param replybody */ - public void onReplyReceived(ReplyBody body) + public abstract void onReplyReceived(ReplyBody replybody); - - /** - * 获取到是否连接到服务端 - * 通过调用CIMPushManager.detectIsConnected()来异步获取 + /** + * 当手机网络发生变化时调用 + * @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 onConnectionStatus(boolean isConnected) + public abstract void onConnectionFailed(Exception e); ``` \ No newline at end of file diff --git a/cim_for_mina/cim-android-sdk/.classpath b/cim_for_mina/cim-android-sdk/.classpath index 679c2cc..3caafff 100644 --- a/cim_for_mina/cim-android-sdk/.classpath +++ b/cim_for_mina/cim-android-sdk/.classpath @@ -4,6 +4,6 @@ - + diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMCacheTools.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMCacheTools.java deleted file mode 100644 index b629023..0000000 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMCacheTools.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * probject:cim-android-sdk - * @version 2.0.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.client.android; - -import android.content.Context; - - class CIMCacheTools { - - - public static String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; - - public static String KEY_ACCOUNT = "KEY_ACCOUNT"; - - public static String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; - - public static String KEY_CIM_DESTORYED = "KEY_CIM_DESTORYED"; - - public static String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; - - public static String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; - - - public static void putString(Context context,String key,String value) - { - context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).edit().putString(key, value).commit(); - } - - public static String getString(Context context,String key) - { - return context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).getString(key,null); - } - - public static void putBoolean(Context context,String key,boolean value) - { - context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).edit().putBoolean(key, value).commit(); - } - - public static boolean getBoolean(Context context,String key) - { - return context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).getBoolean(key,false); - } - - - public static void putInt(Context context,String key,int value) - { - context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).edit().putInt(key, value).commit(); - } - - public static int getInt(Context context,String key) - { - return context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).getInt(key,0); - } -} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventListener.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventListener.java deleted file mode 100644 index 146a8a1..0000000 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventListener.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * probject:cim-android-sdk - * @version 2.0.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.client.android; - -import android.net.NetworkInfo; - -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; - -/** - *CIM 主要事件接口 - */ -public interface CIMEventListener -{ - - - /** - * 当收到服务端推送过来的消息时调用 - * @param message - */ - public void onMessageReceived(Message message); - - /** - * 当调用CIMPushManager.sendRequest()向服务端发送请求,获得相应时调用 - * @param replybody - */ - public void onReplyReceived(ReplyBody replybody); - - /** - * 当手机网络发生变化时调用 - * @param networkinfo - */ - public void onNetworkChanged(NetworkInfo networkinfo); - - /** - * 获取到是否连接到服务端 - * 通过调用CIMPushManager.detectIsConnected()来异步获取 - * - */ - public void onConnectionStatus(boolean isConnected); - - /** - * 连接服务端成功 - */ - public void onCIMConnectionSucceed(); - - - /** - * 连接断开 - */ - public void onCIMConnectionClosed(); -} - diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushManager.java deleted file mode 100644 index 039cbc5..0000000 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushManager.java +++ /dev/null @@ -1,215 +0,0 @@ -/** - * probject:cim-android-sdk - * @version 2.0.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.client.android; -import java.util.UUID; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.telephony.TelephonyManager; - -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.model.SentBody; - -/** - * CIM 功能接口 - */ -public class CIMPushManager { - - static String ACTION_ACTIVATE_PUSH_SERVICE ="ACTION_ACTIVATE_PUSH_SERVICE"; - - static String ACTION_CONNECTION ="ACTION_CONNECTION"; - - static String ACTION_CONNECTION_STATUS ="ACTION_CONNECTION_STATUS"; - - static String ACTION_SENDREQUEST ="ACTION_SENDREQUEST"; - - static String ACTION_DISCONNECTION ="ACTION_DISSENDREQUEST"; - - static String ACTION_DESTORY ="ACTION_DESTORY"; - - static String SERVICE_ACTION ="SERVICE_ACTION"; - - static String KEY_SEND_BODY ="KEY_SEND_BODY"; - - static String KEY_CIM_CONNECTION_STATUS ="KEY_CIM_CONNECTION_STATUS"; - - /** - * 初始化,连接服务端,在程序启动页或者 在Application里调用 - * @param context - * @param ip - * @param port - */ - public static void init(Context context,String ip,int port){ - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED, false); - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP, false); - - CIMCacheTools.putString(context, CIMCacheTools.KEY_CIM_SERVIER_HOST, ip); - CIMCacheTools.putInt(context, CIMCacheTools.KEY_CIM_SERVIER_PORT, port); - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST, ip); - serviceIntent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, port); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_CONNECTION); - context.startService(serviceIntent); - - } - - protected static void init(Context context){ - - boolean isManualStop = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - - if(isManualStop || isManualDestory) - { - return ; - } - - String host = CIMCacheTools.getString(context, CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port =CIMCacheTools.getInt(context, CIMCacheTools.KEY_CIM_SERVIER_PORT); - - init(context,host,port); - - } - - - /** - * 设置一个账号登录到服务端 - * @param account 用户唯一ID - */ - public static void bindAccount(Context context,String account){ - - - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - if(isManualDestory || account==null || account.trim().length()==0) - { - return ; - } - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP, false); - CIMCacheTools.putString(context,CIMCacheTools.KEY_ACCOUNT, account); - - String imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); - imei += context.getPackageName(); - SentBody sent = new SentBody(); - sent.setKey(CIMConstant.RequestKey.CLIENT_BIND); - sent.put("account", account); - sent.put("deviceId",UUID.nameUUIDFromBytes(imei.getBytes()).toString().replaceAll("-", "")); - sent.put("channel", "android"); - sent.put("device",android.os.Build.MODEL); - sent.put("appVersion",getVersionName(context)); - sent.put("osVersion",android.os.Build.VERSION.RELEASE); - sendRequest(context,sent); - - - } - - - protected static void bindAccount(Context context){ - - - - String account = CIMCacheTools.getString(context,CIMCacheTools.KEY_ACCOUNT); - bindAccount(context,account); - } - - - - /** - * 发送一个CIM请求 - * @param context - * @body - */ - public static void sendRequest(Context context,SentBody body){ - - boolean isManualStop = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - - if(isManualStop || isManualDestory) - { - return ; - } - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(KEY_SEND_BODY, body); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_SENDREQUEST); - context.startService(serviceIntent); - - } - - /** - * 停止接受推送,将会退出当前账号登录,端口与服务端的连接 - * @param context - */ - public static void stop(Context context){ - - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - if(isManualDestory){ - return ; - } - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP, true); - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_DISCONNECTION); - context.startService(serviceIntent); - - } - - - /** - * 完全销毁CIM,一般用于完全退出程序,调用resume将不能恢复 - * @param context - */ - public static void destory(Context context){ - - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED, true); - CIMCacheTools.putString(context,CIMCacheTools.KEY_ACCOUNT, null); - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_DESTORY); - context.startService(serviceIntent); - - } - - - /** - * 重新恢复接收推送,重新连接服务端,并登录当前账号 - * @param context - */ - public static void resume(Context context){ - - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - if(isManualDestory){ - return ; - } - - bindAccount(context); - } - - public static void detectIsConnected(Context context){ - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_CONNECTION_STATUS); - context.startService(serviceIntent); - } - - - - private static String getVersionName(Context context) { - String versionName = null; - try { - PackageInfo mPackageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); - versionName = mPackageInfo.versionName; - } catch (NameNotFoundException e) { - } - return versionName; - } - -} \ No newline at end of file diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushService.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushService.java deleted file mode 100644 index 5fe5206..0000000 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushService.java +++ /dev/null @@ -1,97 +0,0 @@ - -package com.farsunset.cim.client.android; -import android.app.Service; -import android.content.Intent; -import android.os.IBinder; -import android.util.Log; - -import com.farsunset.cim.client.model.SentBody; - - -/** - * 与服务端连接服务 - * @author 3979434 - * - */ - public class CIMPushService extends Service { - - protected final static int DEF_CIM_PORT = 28888; - CIMConnectorManager manager; - @Override - public void onCreate() - { - manager = CIMConnectorManager.getManager(this.getApplicationContext()); - } - - - @Override - public int onStartCommand(Intent intent,int flags, int startId) { - - String action; - if(intent==null) - { - intent = new Intent(CIMPushManager.ACTION_CONNECTION); - String host = CIMCacheTools.getString(this, CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port =CIMCacheTools.getInt(this, CIMCacheTools.KEY_CIM_SERVIER_PORT); - intent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST, host); - intent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, port); - } - - action = intent.getStringExtra(CIMPushManager.SERVICE_ACTION); - - if(CIMPushManager.ACTION_CONNECTION.equals(action)) - { - String host = intent.getStringExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port = intent.getIntExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, DEF_CIM_PORT); - manager.connect(host,port); - } - - if(CIMPushManager.ACTION_SENDREQUEST.equals(action)) - { - manager.send((SentBody) intent.getSerializableExtra(CIMPushManager.KEY_SEND_BODY)); - } - - if(CIMPushManager.ACTION_DISCONNECTION.equals(action)) - { - manager.closeSession(); - } - - if(CIMPushManager.ACTION_DESTORY.equals(action)) - { - manager.destroy(); - this.stopSelf(); - android.os.Process.killProcess(android.os.Process.myPid()); - } - - if(CIMPushManager.ACTION_CONNECTION_STATUS.equals(action)) - { - manager.deliverIsConnected(); - } - - if(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action)) - { - - if(!manager.isConnected()) - { - Log.d(CIMPushService.class.getSimpleName(), "cimpush isConnected() = false "); - String host = intent.getStringExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port = intent.getIntExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, DEF_CIM_PORT); - manager.connect(host,port); - }else - { - Log.d(CIMPushService.class.getSimpleName(), "isConnected() = true "); - } - } - - - return Service.START_REDELIVER_INTENT; - } - - - @Override - public IBinder onBind(Intent arg0) { - return null; - } - - -} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java new file mode 100644 index 0000000..0fe4db9 --- /dev/null +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java @@ -0,0 +1,130 @@ +/** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; + +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +class CIMCacheToolkit extends SQLiteOpenHelper { + + private static final String DATABASE_NAME = "CIM_CONFIG_INFO.db"; + private static final int DATABASE_VERSION = 20160416; + + private static final String TABLE_SQL = "CREATE TABLE IF NOT EXISTS T_CIM_CONFIG (KEY VARCHAR(64) PRIMARY KEY,VALUE TEXT)"; + + private static final String DELETE_SQL = "DELETE FROM T_CIM_CONFIG WHERE KEY = ?"; + + private static final String SAVE_SQL = "INSERT INTO T_CIM_CONFIG (KEY,VALUE) VALUES(?,?)"; + + private static final String QUERY_SQL = "SELECT VALUE FROM T_CIM_CONFIG WHERE KEY = ?"; + + public static final String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; + + public static final String KEY_ACCOUNT = "KEY_ACCOUNT"; + + public static final String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; + + public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED"; + + public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; + + public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; + + public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE"; + + static CIMCacheToolkit toolkit; + public static CIMCacheToolkit getInstance(Context context){ + if (toolkit==null){ + toolkit = new CIMCacheToolkit(context); + } + return toolkit; + } + public CIMCacheToolkit(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + } + + public CIMCacheToolkit(Context context){ + this(context, DATABASE_NAME,null, DATABASE_VERSION); + } + + + + public void remove(String key) + { + SQLiteDatabase database = toolkit.getWritableDatabase(); + database.execSQL(DELETE_SQL,new String[]{key}); + database.close(); + toolkit.close(); + toolkit = null; + } + + + public void putString(String key,String value) + { + SQLiteDatabase database = toolkit.getWritableDatabase(); + database.execSQL(DELETE_SQL,new String[]{key}); + database.execSQL(SAVE_SQL, new String[]{key, value}); + database.close(); + + toolkit.close(); + toolkit = null; + + } + + public String getString(String key) + { + String value = null; + SQLiteDatabase database = toolkit.getWritableDatabase(); + Cursor cursor = database.rawQuery(QUERY_SQL, new String[]{key}); + if (cursor!=null&&cursor.moveToFirst()) + { + value = cursor.getString(0); + } + + cursor.close(); + database.close(); + toolkit.close(); + toolkit = null; + + return value; + } + + public void putBoolean(String key,boolean value) + { + putString(key,Boolean.toString(value)); + } + + public boolean getBoolean(String key) + { + String value = getString(key); + return value == null?false:Boolean.parseBoolean(value); + } + + + public void putInt(String key,int value) + { + putString(key, String.valueOf(value)); + } + + public int getInt(String key) + { + String value = getString(key); + return value == null?0:Integer.parseInt(value); + } + + @Override + public void onCreate(SQLiteDatabase database) { + database.execSQL(TABLE_SQL); + } + + @Override + public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { + + } +} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMConnectorManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java similarity index 75% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMConnectorManager.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java index c1cb573..82ed38c 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMConnectorManager.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.android; +package com.farsunset.cim.sdk.android; import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -20,21 +20,20 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.keepalive.KeepAliveFilter; import org.apache.mina.filter.keepalive.KeepAliveMessageFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; - import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.exception.CIMSessionDisableException; -import com.farsunset.cim.client.exception.NetWorkDisableException; -import com.farsunset.cim.client.exception.WriteToClosedSessionException; -import com.farsunset.cim.client.filter.ClientMessageCodecFactory; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; -import com.farsunset.cim.client.model.SentBody; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.exception.CIMSessionDisableException; +import com.farsunset.cim.sdk.android.exception.NetWorkDisableException; +import com.farsunset.cim.sdk.android.exception.WriteToClosedSessionException; +import com.farsunset.cim.sdk.android.filter.ClientMessageCodecFactory; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; +import com.farsunset.cim.sdk.android.model.SentBody; /** * 连接服务端管理,cim核心处理类,管理连接,以及消息处理 @@ -49,7 +48,12 @@ class CIMConnectorManager { Context context; - + private final int BOTH_IDLE_TIME = 120;//秒 + + private final int HEARBEAT_TIME_OUT = 330 * 1000;// 收到服务端心跳请求超时时间 毫秒 + + private final String KEY_LAST_HEART_TIME = "KEY_LAST_HEART_TIME" ; + static CIMConnectorManager manager; // 消息广播action @@ -59,13 +63,13 @@ class CIMConnectorManager { public static final String ACTION_SENT_FAILED = "com.farsunset.cim.SENT_FAILED"; // 发送sendbody成功广播 - public static final String ACTION_SENT_SUCCESS = "com.farsunset.cim.SENT_SUCCESS"; + public static final String ACTION_SENT_SUCCESSED = "com.farsunset.cim.SENT_SUCCESSED"; // 链接意外关闭广播 public static final String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.CONNECTION_CLOSED"; // 链接失败广播 public static final String ACTION_CONNECTION_FAILED = "com.farsunset.cim.CONNECTION_FAILED"; // 链接成功广播 - public static final String ACTION_CONNECTION_SUCCESS = "com.farsunset.cim.CONNECTION_SUCCESS"; + public static final String ACTION_CONNECTION_SUCCESSED = "com.farsunset.cim.CONNECTION_SUCCESSED"; // 发送sendbody成功后获得replaybody回应广播 public static final String ACTION_REPLY_RECEIVED = "com.farsunset.cim.REPLY_RECEIVED"; // 网络变化广播 @@ -74,19 +78,18 @@ class CIMConnectorManager { // 未知异常 public static final String ACTION_UNCAUGHT_EXCEPTION = "com.farsunset.cim.UNCAUGHT_EXCEPTION"; - // CIM连接状态 - public static final String ACTION_CONNECTION_STATUS = "com.farsunset.cim.CONNECTION_STATUS"; - + //重试连接 + public final static String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY"; private ExecutorService executor; - private CIMConnectorManager(Context ctx) { context = ctx; - executor = Executors.newFixedThreadPool(3); + executor = Executors.newFixedThreadPool(1); connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(10 * 1000); connector.getSessionConfig().setTcpNoDelay(true); + connector.getSessionConfig().setBothIdleTime(BOTH_IDLE_TIME); connector.getSessionConfig().setReadBufferSize(2048); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ClientMessageCodecFactory())); @@ -113,6 +116,8 @@ class CIMConnectorManager { if(isConnected()){ return ; } + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, false); InetSocketAddress remoteSocketAddress = new InetSocketAddress(cimServerHost, cimServerPort); connectFuture = connector.connect(remoteSocketAddress); connectFuture.awaitUninterruptibly(); @@ -124,7 +129,7 @@ class CIMConnectorManager { intent.putExtra("exception", e); context.sendBroadcast(intent); - Log.i(TAG, "******************CIM连接服务器失败 "+cimServerHost+":"+cimServerPort); + Log.e(TAG, "******************CIM连接服务器失败 "+cimServerHost+":"+cimServerPort); } @@ -205,7 +210,7 @@ class CIMConnectorManager { public void destroy() { IoSession session = getCurrentSession(); if (session != null) { - session.close(false); + session.closeNow(); session.removeAttribute("account"); } @@ -223,13 +228,6 @@ class CIMConnectorManager { return session.isConnected() ; } - public void deliverIsConnected() { - Intent intent = new Intent(); - intent.setAction(ACTION_CONNECTION_STATUS); - intent.putExtra(CIMPushManager.KEY_CIM_CONNECTION_STATUS, isConnected()); - context.sendBroadcast(intent); - } - public void closeSession() @@ -237,7 +235,7 @@ class CIMConnectorManager { IoSession session = getCurrentSession(); if(session!=null) { - session.close(false); + session.closeNow(); } } @@ -262,8 +260,10 @@ class CIMConnectorManager { Log.i(TAG, "******************CIM连接服务器成功:"+session.getLocalAddress()); + setLastHeartbeatTime(session); + Intent intent = new Intent(); - intent.setAction(ACTION_CONNECTION_SUCCESS); + intent.setAction(ACTION_CONNECTION_SUCCESSED); context.sendBroadcast(intent); } @@ -276,7 +276,7 @@ class CIMConnectorManager { @Override public void sessionClosed(IoSession session) throws Exception { - Log.i(TAG, "******************CIM与服务器断开连接:"+session.getLocalAddress()); + Log.e(TAG, "******************CIM与服务器断开连接:"+session.getLocalAddress()); Intent intent = new Intent(); intent.setAction(ACTION_CONNECTION_CLOSED); @@ -285,10 +285,19 @@ class CIMConnectorManager { } @Override - public void sessionIdle(IoSession session, IdleStatus status) - throws Exception { - - Log.i(TAG, "******************CIM与服务器连接空闲:"+session.getLocalAddress()); + public void sessionIdle(IoSession session, IdleStatus status)throws Exception { + Log.d(TAG, "******************CIM与服务器连接空闲:"+session.getLocalAddress() + " isActive:" + session.isActive()+ " isConnected:" + session.isConnected()); + + /** + * 用于解决,wifi情况下。偶而路由器与服务器断开连接时,客户端并没及时收到关闭事件 + * 导致这样的情况下当前连接无效也不会重连的问题 + * + */ + long lastHeartbeatTime = getLastHeartbeatTime(session); + if(System.currentTimeMillis() - lastHeartbeatTime >= HEARBEAT_TIME_OUT) + { + session.closeNow(); + } } @Override @@ -328,13 +337,29 @@ class CIMConnectorManager { if(message instanceof SentBody) { Intent intent = new Intent(); - intent.setAction(ACTION_SENT_SUCCESS); + intent.setAction(ACTION_SENT_SUCCESSED); intent.putExtra("sentBody", (SentBody) message); context.sendBroadcast(intent); } } }; + + private void setLastHeartbeatTime(IoSession session) + { + session.setAttribute(KEY_LAST_HEART_TIME, System.currentTimeMillis()); + } + + private long getLastHeartbeatTime(IoSession session) + { + long time = 0; + Object value ; + if((value = session.getAttribute(KEY_LAST_HEART_TIME)) !=null){ + time = Long.parseLong(value.toString()); + } + return time; + } + public static boolean netWorkAvailable(Context context) { try { ConnectivityManager nw = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); @@ -358,8 +383,11 @@ class CIMConnectorManager { } @Override - public boolean isRequest(IoSession arg0, Object arg1) { - return CIMConstant.CMD_HEARTBEAT_REQUEST.equals(arg1); + public boolean isRequest(IoSession session, Object data) { + + setLastHeartbeatTime(session); + + return CIMConstant.CMD_HEARTBEAT_REQUEST.equalsIgnoreCase(data.toString()); } @Override diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventBroadcastReceiver.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java similarity index 66% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventBroadcastReceiver.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java index 9a68fa5..6c02e5b 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventBroadcastReceiver.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java @@ -4,35 +4,34 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.android; +package com.farsunset.cim.sdk.android; -import java.util.List; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningTaskInfo; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.exception.CIMSessionDisableException; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; +import com.farsunset.cim.sdk.android.model.SentBody; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; - -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.exception.CIMSessionDisableException; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; -import com.farsunset.cim.client.model.SentBody; /** * 消息入口,所有消息都会经过这里 */ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver implements CIMEventListener { - public Context context; + @Override public void onReceive(Context ctx, Intent it) { context = ctx; + + /* * 操作事件广播,用于提高service存活率 @@ -61,11 +60,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl */ if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_CLOSED)) { - if(CIMConnectorManager.netWorkAvailable(context)) - { - CIMPushManager.init(context); - } - onCIMConnectionClosed(); + onInnerConnectionClosed(); } /* @@ -73,19 +68,15 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl */ if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_FAILED)) { - onConnectionFailed((Exception) it.getSerializableExtra("exception")); + onInnerConnectionFailed((Exception) it.getSerializableExtra("exception")); } /* * cim连接服务器成功事件 */ - if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_SUCCESS)) + if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_SUCCESSED)) { - - - CIMPushManager.bindAccount(context); - - onCIMConnectionSucceed(); + onInnerConnectionSuccessed(); } /* @@ -93,7 +84,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl */ if(it.getAction().equals(CIMConnectorManager.ACTION_MESSAGE_RECEIVED)) { - filterType999Message((Message)it.getSerializableExtra("message")); + onInnerMessageReceived((Message)it.getSerializableExtra("message")); } @@ -117,7 +108,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl /* * 获取sendbody发送成功事件 */ - if(it.getAction().equals(CIMConnectorManager.ACTION_SENT_SUCCESS)) + if(it.getAction().equals(CIMConnectorManager.ACTION_SENT_SUCCESSED)) { onSentSucceed((SentBody)it.getSerializableExtra("sentBody")); } @@ -131,60 +122,60 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl onUncaughtException((Exception)it.getSerializableExtra("exception")); } + /* - * 获取cim连接状态事件 + * 重新连接,如果断开的话 */ - if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_STATUS)) + if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_RECOVERY)) { - onConnectionStatus(it.getBooleanExtra(CIMPushManager.KEY_CIM_CONNECTION_STATUS, false)); + CIMPushManager.connect(context); } } - protected boolean isInBackground(Context context) { - List tasksInfo = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningTasks(1); - if (tasksInfo.size() > 0) { - - if (context.getPackageName().equals( - tasksInfo.get(0).topActivity.getPackageName())) { - - return false; - } - } - return true; - } - - private void startPushService() { Intent intent = new Intent(context, CIMPushService.class); - intent.putExtra(CIMPushManager.SERVICE_ACTION, CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE); + intent.setAction(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE); context.startService(intent); } + private void onInnerConnectionClosed(){ + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, false); + if(CIMConnectorManager.netWorkAvailable(context)) + { + CIMPushManager.connect(context); + } + + onConnectionClosed(); + } - - + Handler connectionHandler = new Handler(){ + @Override + public void handleMessage(android.os.Message message){ + CIMPushManager.connect(context); + } + }; - private void onConnectionFailed(Exception e){ + private void onInnerConnectionFailed(Exception e){ if(CIMConnectorManager.netWorkAvailable(context)) { - //间隔30秒后重连 - connectionHandler.sendMessageDelayed(connectionHandler.obtainMessage(), 30*1000); - } - } - - - Handler connectionHandler = new Handler() - { - @Override - public void handleMessage(android.os.Message message){ - - CIMPushManager.init(context); + connectionHandler.sendEmptyMessageDelayed(0, CIMConstant.RECONN_INTERVAL_TIME); } - }; + onConnectionFailed(e); + } + + + + + private void onInnerConnectionSuccessed(){ + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, true); + + boolean autoBind = CIMPushManager.autoBindAccount(context); + onConnectionSuccessed(autoBind); + } private void onUncaughtException(Throwable arg0) {} @@ -194,17 +185,17 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl if(info !=null) { - CIMPushManager.init(context); + CIMPushManager.connect(context); } onNetworkChanged(info); } - private void filterType999Message(com.farsunset.cim.client.model.Message message) + private void onInnerMessageReceived(com.farsunset.cim.sdk.android.model.Message message) { if(CIMConstant.MessageType.TYPE_999.equals(message.getType())) { - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP,true); + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP,true); } onMessageReceived(message); @@ -215,7 +206,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl //与服务端端开链接,重新连接 if(e instanceof CIMSessionDisableException) { - CIMPushManager.init(context); + CIMPushManager.connect(context); }else { //发送失败 重新发送 @@ -225,15 +216,12 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl } private void onSentSucceed(SentBody body){} - @Override - public abstract void onMessageReceived(com.farsunset.cim.client.model.Message message); + public abstract void onMessageReceived(Message message); @Override public abstract void onReplyReceived(ReplyBody body); - public abstract void onNetworkChanged(NetworkInfo info); - - public abstract void onCIMConnectionSucceed(); + public abstract void onConnectionFailed(Exception e); + - public abstract void onCIMConnectionClosed(); } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java new file mode 100644 index 0000000..01f769e --- /dev/null +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java @@ -0,0 +1,57 @@ +/** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; + +import android.net.NetworkInfo; + +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; + +/** + *CIM 主要事件接口 + */ +public interface CIMEventListener +{ + + + /** + * 当收到服务端推送过来的消息时调用 + * @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); +} + diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMListenerManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java similarity index 59% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMListenerManager.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java index f2d2965..27eced5 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMListenerManager.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java @@ -4,17 +4,21 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.android; +package com.farsunset.cim.sdk.android; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import com.farsunset.cim.client.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; +import android.net.NetworkInfo; +import android.util.Log; /** @@ -44,13 +48,53 @@ public class CIMListenerManager { } } - public static ArrayList getCIMListeners() { - return cimListeners; + + public static void notifyOnNetworkChanged(NetworkInfo info) { + for (CIMEventListener listener : cimListeners) { + listener.onNetworkChanged(info); + } } + public static void notifyOnConnectionSuccessed(boolean hasAutoBind) { + for (CIMEventListener listener : cimListeners) { + listener.onConnectionSuccessed(hasAutoBind); + } + } + public static void notifyOnMessageReceived(Message message) { + for (CIMEventListener listener : cimListeners) { + listener.onMessageReceived(message); + } + } + + public static void notifyOnConnectionClosed() { + for (CIMEventListener listener : cimListeners) { + listener.onConnectionClosed(); + } + } + public static void notifyOnReplyReceived(ReplyBody body) { + for (CIMEventListener listener : cimListeners) { + listener.onReplyReceived(body); + } + } + + public static void notifyOnConnectionFailed(Exception e) { + for (CIMEventListener listener : cimListeners) { + listener.onConnectionFailed(e); + } + } + + public static void destory() { + cimListeners.clear(); + } + + public static void logListenersName() { + for (CIMEventListener listener : cimListeners) { + Log.i(CIMEventListener.class.getSimpleName(),"#######" + listener.getClass().getName() + "#######" ); + } + } /** * 消息接收activity的接收顺序排序,CIM_RECEIVE_ORDER倒序 @@ -69,7 +113,7 @@ public class CIMListenerManager { Integer order1 = CIMConstant.CIM_DEFAULT_MESSAGE_ORDER; Integer order2 = CIMConstant.CIM_DEFAULT_MESSAGE_ORDER; ActivityInfo info; - if (arg1 instanceof Activity ) { + if (arg1 instanceof Activity ) { try { info = mcontext.getPackageManager() .getActivityInfo(((Activity)(arg1)).getComponentName(), PackageManager.GET_META_DATA); diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java new file mode 100644 index 0000000..295ecb0 --- /dev/null +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -0,0 +1,250 @@ +/** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; +import java.util.UUID; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.telephony.TelephonyManager; + +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.model.SentBody; + +/** + * CIM 功能接口 + */ +public class CIMPushManager { + + static String ACTION_ACTIVATE_PUSH_SERVICE ="ACTION_ACTIVATE_PUSH_SERVICE"; + + static String ACTION_CREATE_CIM_CONNECTION ="ACTION_CREATE_CIM_CONNECTION"; + + static String ACTION_SEND_REQUEST_BODY ="ACTION_SEND_REQUEST_BODY"; + + static String ACTION_CLOSE_CIM_CONNECTION ="ACTION_CLOSE_CIM_CONNECTION"; + + static String ACTION_DESTORY ="ACTION_DESTORY"; + + static String KEY_SEND_BODY ="KEY_SEND_BODY"; + + static String KEY_CIM_CONNECTION_STATUS ="KEY_CIM_CONNECTION_STATUS"; + + //被销毁的destroy() + public static final int STATE_DESTROYED = 0x0000DE; + //被销停止的 stop() + public static final int STATE_STOPED = 0x0000EE; + + public static final int STATE_NORMAL = 0x000000; + /** + * 初始化,连接服务端,在程序启动页或者 在Application里调用 + * @param context + * @param ip + * @param port + */ + public static void connect(Context context,String host,int port){ + + connect(context,host,port,false); + + } + +private static void connect(Context context,String ip,int port,boolean autoBind){ + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, false); + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); + + CIMCacheToolkit.getInstance(context).putString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); + CIMCacheToolkit.getInstance(context).putInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + + if(!autoBind) + { + CIMCacheToolkit.getInstance(context).remove(CIMCacheToolkit.KEY_ACCOUNT); + } + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); + serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION); + context.startService(serviceIntent); + + } + + protected static void connect(Context context){ + + boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + + if(isManualStop || isManualDestory) + { + return ; + } + + String host = CIMCacheToolkit.getInstance(context).getString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST); + int port =CIMCacheToolkit.getInstance(context).getInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + + connect(context,host,port,true); + + } + + + /** + * 设置一个账号登录到服务端 + * @param account 用户唯一ID + */ + public static void bindAccount(Context context,String account){ + + + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory || account==null || account.trim().length()==0) + { + return ; + } + sendBindRequest(context,account); + + } + + + private static void sendBindRequest(Context context, String account){ + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); + CIMCacheToolkit.getInstance(context).putString(CIMCacheToolkit.KEY_ACCOUNT, account); + + String imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); + imei += context.getPackageName(); + SentBody sent = new SentBody(); + sent.setKey(CIMConstant.RequestKey.CLIENT_BIND); + sent.put("account", account); + sent.put("deviceId",UUID.nameUUIDFromBytes(imei.getBytes()).toString().replaceAll("-", "")); + sent.put("channel", "android"); + sent.put("device",android.os.Build.MODEL); + sent.put("version",getVersionName(context)); + sent.put("osVersion",android.os.Build.VERSION.RELEASE); + sent.put("packageName",context.getPackageName()); + sendRequest(context,sent); + } + + protected static boolean autoBindAccount(Context context){ + + String account = CIMCacheToolkit.getInstance(context).getString(CIMCacheToolkit.KEY_ACCOUNT); + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualStoped = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + if( isManualStoped || account==null || account.trim().length()==0 || isManualDestory ) + { + return false; + } + + sendBindRequest(context,account); + + return true; + } + + + + /** + * 发送一个CIM请求 + * @param context + * @body + */ + public static void sendRequest(Context context, SentBody body){ + + boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + + if(isManualStop || isManualDestory) + { + return ; + } + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.putExtra(KEY_SEND_BODY, body); + serviceIntent.setAction(ACTION_SEND_REQUEST_BODY); + context.startService(serviceIntent); + + } + + /** + * 停止接受推送,将会退出当前账号登录,端口与服务端的连接 + * @param context + */ + public static void stop(Context context){ + + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory){ + return ; + } + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, true); + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION); + context.startService(serviceIntent); + + } + + + /** + * 完全销毁CIM,一般用于完全退出程序,调用resume将不能恢复 + * @param context + */ + public static void destroy(Context context){ + + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, true); + CIMCacheToolkit.getInstance(context).remove(CIMCacheToolkit.KEY_ACCOUNT); + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.setAction(ACTION_DESTORY); + context.startService(serviceIntent); + + } + + + /** + * 重新恢复接收推送,重新连接服务端,并登录当前账号如果aotuBind == true + * @param context + * @param aotuBind + */ + public static void resume(Context context){ + + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory){ + return ; + } + + autoBindAccount(context); + } + + public static boolean isConnected(Context context){ + return CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE); + } + + public static int getState(Context context){ + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory){ + return STATE_DESTROYED; + } + + boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + if(isManualStop){ + return STATE_STOPED; + } + + return STATE_NORMAL; + } + + private static String getVersionName(Context context) { + String versionName = null; + try { + PackageInfo mPackageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + versionName = mPackageInfo.versionName; + } catch (NameNotFoundException e) { + } + return versionName; + } + +} \ No newline at end of file diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java new file mode 100644 index 0000000..1c80b3b --- /dev/null +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java @@ -0,0 +1,106 @@ + /** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; + +import com.farsunset.cim.sdk.android.model.SentBody; + + +/** + * 与服务端连接服务 + * + */ + public class CIMPushService extends Service { + + protected final static int DEF_CIM_PORT = 28888; + CIMConnectorManager manager; + WakeLock wakeLock; + @Override + public void onCreate() + { + manager = CIMConnectorManager.getManager(this.getApplicationContext()); + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, CIMPushService.class.getName()); + } + + + @Override + public int onStartCommand(Intent intent,int flags, int startId) { + + if(intent==null) + { + return START_STICKY; + } + + String action = intent.getAction(); + + if(CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) + { + String host = CIMCacheToolkit.getInstance(this).getString(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); + int port =CIMCacheToolkit.getInstance(this).getInt(CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + manager.connect(host,port); + } + + if(CIMPushManager.ACTION_SEND_REQUEST_BODY.equals(action)) + { + manager.send((SentBody) intent.getSerializableExtra(CIMPushManager.KEY_SEND_BODY)); + } + + if(CIMPushManager.ACTION_CLOSE_CIM_CONNECTION.equals(action)) + { + manager.closeSession(); + } + + if(CIMPushManager.ACTION_DESTORY.equals(action)) + { + manager.destroy(); + this.stopSelf(); + android.os.Process.killProcess(android.os.Process.myPid()); + } + + if(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action) && !manager.isConnected()) + { + + String host = CIMCacheToolkit.getInstance(this).getString(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); + int port =CIMCacheToolkit.getInstance(this).getInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + manager.connect(host,port); + } + + try{ + if(!wakeLock.isHeld()) + { + this.wakeLock.acquire(); + } + }catch(Exception e){} + + + return START_STICKY; + } + + + public void onDestroy() + { + super.onDestroy(); + if(wakeLock.isHeld()) + { + this.wakeLock.release(); + wakeLock = null; + } + } + + + @Override + public IBinder onBind(Intent arg0) { + return null; + } + +} diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/constant/CIMConstant.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java similarity index 74% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/constant/CIMConstant.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java index c1e85ef..8846777 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/constant/CIMConstant.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.constant; +package com.farsunset.cim.sdk.android.constant; /** * 常量 @@ -16,6 +16,7 @@ public interface CIMConstant { public static byte MESSAGE_SEPARATE='\b'; + public static long RECONN_INTERVAL_TIME= 30 * 1000; public static int CIM_DEFAULT_MESSAGE_ORDER=1; @@ -37,13 +38,13 @@ public interface CIMConstant { } /** - * 服务端心跳请求命令 + * 服务端心跳请求命令 cmd_server_hb_request */ - public static final String CMD_HEARTBEAT_REQUEST="cmd_server_hb_request"; + public static final String CMD_HEARTBEAT_REQUEST="S_H_RQ"; /** - * 客户端心跳响应命令 + * 客户端心跳响应命令 cmd_client_hb_response */ - public static final String CMD_HEARTBEAT_RESPONSE ="cmd_client_hb_response"; + public static final String CMD_HEARTBEAT_RESPONSE ="C_H_RS"; public static class RequestKey{ diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/CIMSessionDisableException.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/CIMSessionDisableException.java similarity index 86% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/CIMSessionDisableException.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/CIMSessionDisableException.java index 831e66a..7fb83fe 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/CIMSessionDisableException.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/CIMSessionDisableException.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.exception; +package com.farsunset.cim.sdk.android.exception; public class CIMSessionDisableException extends Exception { diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/NetWorkDisableException.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetWorkDisableException.java similarity index 86% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/NetWorkDisableException.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetWorkDisableException.java index c5ed6ab..f35ed57 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/NetWorkDisableException.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetWorkDisableException.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.exception; +package com.farsunset.cim.sdk.android.exception; public class NetWorkDisableException extends Exception { diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/WriteToClosedSessionException.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/WriteToClosedSessionException.java similarity index 88% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/WriteToClosedSessionException.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/WriteToClosedSessionException.java index 399723e..d01c683 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/WriteToClosedSessionException.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/WriteToClosedSessionException.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.exception; +package com.farsunset.cim.sdk.android.exception; import java.io.Serializable; diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageCodecFactory.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java similarity index 96% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageCodecFactory.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java index abd07dc..dbfeba5 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageCodecFactory.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.filter; +package com.farsunset.cim.sdk.android.filter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageDecoder.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java similarity index 62% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageDecoder.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java index f7aecf6..54be3a0 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageDecoder.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.filter; +package com.farsunset.cim.sdk.android.filter; import java.io.ByteArrayInputStream; @@ -21,9 +21,9 @@ import org.w3c.dom.NodeList; import android.util.Log; -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; /** * 客户端消息解码 */ @@ -60,9 +60,6 @@ public class ClientMessageDecoder extends CumulativeProtocolDecoder { String message = new String(bytes, CIMConstant.UTF8); buff.clear(); - //打印出收到的消息 - Log.i(TAG,message); - try { Object msg = mappingMessageObject(message); @@ -71,7 +68,6 @@ public class ClientMessageDecoder extends CumulativeProtocolDecoder { { e.printStackTrace(); } - } return complete; @@ -79,7 +75,10 @@ public class ClientMessageDecoder extends CumulativeProtocolDecoder { private Object mappingMessageObject(String message) throws Exception { - if(CIMConstant.CMD_HEARTBEAT_REQUEST.equals(message)) + + Log.i(TAG,message.toString()); + + if(CIMConstant.CMD_HEARTBEAT_REQUEST.equalsIgnoreCase(message)) { return message; } @@ -104,16 +103,61 @@ public class ClientMessageDecoder extends CumulativeProtocolDecoder { if (name.equals("message")) { Message body = new Message(); - body.setType(doc.getElementsByTagName("type").item(0).getTextContent()); - body.setContent(doc.getElementsByTagName("content").item(0).getTextContent()); - body.setFile(doc.getElementsByTagName("file").item(0).getTextContent()); - body.setFileType(doc.getElementsByTagName("fileType").item(0).getTextContent()); - body.setTitle(doc.getElementsByTagName("title").item(0).getTextContent()); - body.setSender(doc.getElementsByTagName("sender").item(0).getTextContent()); - body.setReceiver(doc.getElementsByTagName("receiver").item(0).getTextContent()); - body.setFormat(doc.getElementsByTagName("format").item(0).getTextContent()); - body.setMid(doc.getElementsByTagName("mid").item(0).getTextContent()); - body.setTimestamp(Long.valueOf(doc.getElementsByTagName("timestamp").item(0).getTextContent())); + NodeList nodeList = doc.getElementsByTagName("message").item(0).getChildNodes(); + int count = nodeList.getLength(); + for(int i = 0;i < count; i++){ + Node node = nodeList.item(i); + + if(node.getNodeName().equals("mid")) + { + body.setMid(node.getTextContent()); + } + + if(node.getNodeName().equals("type")) + { + body.setType(node.getTextContent()); + } + + if(node.getNodeName().equals("content")) + { + body.setContent(node.getTextContent()); + } + + if(node.getNodeName().equals("file")) + { + body.setFile(node.getTextContent()); + } + + if(node.getNodeName().equals("fileType")) + { + body.setFileType(node.getTextContent()); + } + + if(node.getNodeName().equals("title")) + { + body.setTitle(node.getTextContent()); + } + + if(node.getNodeName().equals("sender")) + { + body.setSender(node.getTextContent()); + } + + if(node.getNodeName().equals("receiver")) + { + body.setReceiver(node.getTextContent()); + } + + if(node.getNodeName().equals("format")) + { + body.setFormat(node.getTextContent()); + } + + if(node.getNodeName().equals("timestamp")) + { + body.setTimestamp(Long.valueOf(node.getTextContent())); + } + } return body; } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageEncoder.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java similarity index 90% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageEncoder.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java index e8eb8f5..4ec4953 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageEncoder.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.filter; +package com.farsunset.cim.sdk.android.filter; @@ -15,7 +15,7 @@ import org.apache.mina.filter.codec.ProtocolEncoderOutput; import android.util.Log; -import com.farsunset.cim.client.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.CIMConstant; /** * 客户端消息发送前进行编码,可在此加密消息 */ diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/Message.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java similarity index 69% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/Message.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java index 0ea72e5..ce19251 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/Message.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.model; +package com.farsunset.cim.sdk.android.model; import java.io.Serializable; /** @@ -137,28 +137,54 @@ public class Message implements Serializable { this.format = format; } - public String toString() - { - + public String toString() { + StringBuffer buffer = new StringBuffer(); buffer.append(""); buffer.append(""); buffer.append("").append(mid).append(""); - buffer.append("").append(type).append(""); - buffer.append("").append(this.getTitle()==null?"":this.getTitle()).append(""); - buffer.append(""); - buffer.append("").append(this.getFile()==null?"":this.getFile()).append(""); - buffer.append("").append(this.getFileType()==null?"":this.getFileType()).append(""); - buffer.append("").append(this.getSender()==null?"":this.getSender()).append(""); - buffer.append("").append(this.getReceiver()==null?"":this.getReceiver()).append(""); - buffer.append("").append(this.getFormat()==null?"":this.getFormat()).append(""); - buffer.append("").append(timestamp).append(""); + + if (isNotEmpty(type)) { + buffer.append("").append(type).append(""); + } + + if (isNotEmpty(title)) { + buffer.append("").append(title).append(""); + } + if (isNotEmpty(content)) { + buffer.append(""); + } + + if (isNotEmpty(file)) { + buffer.append("").append(file).append(""); + } + + if (isNotEmpty(fileType)) { + buffer.append("").append(fileType).append(""); + } + + if (isNotEmpty(sender)) { + buffer.append("").append(sender).append(""); + } + + if (isNotEmpty(receiver)) { + buffer.append("").append(receiver).append(""); + } + + if (isNotEmpty(format)) { + buffer.append("").append(format).append(""); + } + + if (timestamp > 0) { + buffer.append("").append(timestamp).append(""); + } + buffer.append(""); return buffer.toString(); } - public String toXmlString() - { - + + public String toXmlString() { + return toString(); } @@ -169,6 +195,10 @@ public class Message implements Serializable { public void setMid(String mid) { this.mid = mid; } - + + public boolean isNotEmpty(String txt) { + return txt != null && !txt.isEmpty(); + } + } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/ReplyBody.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java similarity index 97% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/ReplyBody.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java index 0bc938f..4497506 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/ReplyBody.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.model; +package com.farsunset.cim.sdk.android.model; import java.io.Serializable; import java.util.HashMap; diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/SentBody.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java similarity index 97% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/SentBody.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java index 38c444f..c0f1508 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/SentBody.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.model; +package com.farsunset.cim.sdk.android.model; import java.io.Serializable; import java.util.HashMap; diff --git a/cim_for_mina/cim-server-sdk/.classpath b/cim_for_mina/cim-server-sdk/.classpath index 85dc364..f6610bc 100644 --- a/cim_for_mina/cim-server-sdk/.classpath +++ b/cim_for_mina/cim-server-sdk/.classpath @@ -2,7 +2,7 @@ - + diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/constant/CIMConstant.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/constant/CIMConstant.java similarity index 73% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/constant/CIMConstant.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/constant/CIMConstant.java index 335214e..3881fdd 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/constant/CIMConstant.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/constant/CIMConstant.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com */ -package com.farsunset.cim.server.constant; +package com.farsunset.cim.sdk.server.constant; /** * 常量 @@ -31,6 +31,8 @@ public interface CIMConstant { public static String UTF8="UTF-8"; public static byte MESSAGE_SEPARATE='\b'; + //flex客户端 安全策略验证时会收到\0 + public static byte FLEX_DATA_SEPARATE = '\0'; public static int CIM_DEFAULT_MESSAGE_ORDER=1; @@ -49,23 +51,15 @@ public interface CIMConstant { public static final String FLEX_POLICY_RESPONSE ="\0"; /** - * 服务端心跳请求命令 + * 服务端心跳请求命令 cmd_server_hb_request */ - public static final String CMD_HEARTBEAT_REQUEST="cmd_server_hb_request"; + public static final String CMD_HEARTBEAT_REQUEST="S_H_RQ"; /** - * 客户端心跳响应命令 + * 客户端心跳响应命令 cmd_client_hb_response */ - public static final String CMD_HEARTBEAT_RESPONSE ="cmd_client_hb_response"; + public static final String CMD_HEARTBEAT_RESPONSE ="C_H_RS"; - - /** - * 对应ichat 中 spring-cim.xml > bean:mainIoHandler >handlers - * 为 服务端处理对应的handlers,应该继承与com.farsunset.cim.nio.handle.AbstractHandler - - * - */ - - + public static class SessionStatus{ diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageCodecFactory.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageCodecFactory.java similarity index 91% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageCodecFactory.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageCodecFactory.java index 977b113..c250f6e 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageCodecFactory.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageCodecFactory.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.filter; + */ +package com.farsunset.cim.sdk.server.filter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageDecoder.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageDecoder.java similarity index 80% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageDecoder.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageDecoder.java index 4a46d52..5621a39 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageDecoder.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageDecoder.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.filter; + */ +package com.farsunset.cim.sdk.server.filter; import java.io.ByteArrayInputStream; @@ -20,8 +20,8 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import com.farsunset.cim.server.constant.CIMConstant; -import com.farsunset.cim.server.model.SentBody; +import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.model.SentBody; /** * 服务端接收消息解码,可在此解密消息 */ @@ -42,12 +42,12 @@ public class ServerMessageDecoder extends CumulativeProtocolDecoder { complete = true; break; - }else if(b == '\0')//flex客户端 安全策略验证时会收到\0的消息,忽略此消息内容 + }else if(b == CIMConstant.FLEX_DATA_SEPARATE)//flex客户端 安全策略验证时会收到\0的消息,忽略此消息内容 { complete = true; break; } - else { + else { buff.put(b); } } @@ -66,7 +66,9 @@ public class ServerMessageDecoder extends CumulativeProtocolDecoder { Object body = getSentBody(message); out.write(body); }catch(Exception e){ - out.write(message);//解析xml失败 是返回原始的xml数据到上层处理,比如心跳响应、flex sokcet的 安全验证请求xml + out.write(message);//解析xml失败 是返回原始的xml数据到上层处理,比如flex sokcet的 安全验证请求xml + e.printStackTrace(); + logger.warn(e.getMessage()); } } return complete; @@ -75,6 +77,11 @@ public class ServerMessageDecoder extends CumulativeProtocolDecoder { public Object getSentBody(String message) throws Exception { + if(CIMConstant.CMD_HEARTBEAT_RESPONSE.equalsIgnoreCase(message)) + { + return CIMConstant.CMD_HEARTBEAT_RESPONSE; + } + SentBody body = new SentBody(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageEncoder.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageEncoder.java similarity index 84% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageEncoder.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageEncoder.java index 4525921..82998d3 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageEncoder.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageEncoder.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.filter; + */ +package com.farsunset.cim.sdk.server.filter; import org.apache.log4j.Logger; import org.apache.mina.core.buffer.IoBuffer; @@ -12,7 +12,7 @@ import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolEncoderAdapter; import org.apache.mina.filter.codec.ProtocolEncoderOutput; -import com.farsunset.cim.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.constant.CIMConstant; /** * 服务端发送消息前编码,可在此加密消息 diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMIoHandler.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMIoHandler.java similarity index 88% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMIoHandler.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMIoHandler.java index 6cc79e6..a0e6588 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMIoHandler.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMIoHandler.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.handler; + */ +package com.farsunset.cim.sdk.server.handler; import java.util.HashMap; @@ -13,10 +13,10 @@ import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; -import com.farsunset.cim.server.constant.CIMConstant; -import com.farsunset.cim.server.model.ReplyBody; -import com.farsunset.cim.server.model.SentBody; -import com.farsunset.cim.server.session.CIMSession; +import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.sdk.server.session.CIMSession; /** * @@ -84,7 +84,7 @@ public class CIMIoHandler extends IoHandlerAdapter { CIMSession cimSession =new CIMSession(ios); try{ - logger.debug("sessionClosed()... from "+cimSession.getRemoteAddress()); + logger.warn("sessionClosed()... from "+cimSession.getRemoteAddress()); CIMRequestHandler handler = handlers.get(CIMSESSION_CLOSED_HANDLER_KEY); if(handler!=null && cimSession.containsAttribute(CIMConstant.SESSION_KEY)) { diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMRequestHandler.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java similarity index 50% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMRequestHandler.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java index feb44f2..4dbcdd9 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMRequestHandler.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java @@ -1,18 +1,18 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.handler; + */ +package com.farsunset.cim.sdk.server.handler; /** * 请求处理接口,所有的请求实现必须实现此接口 * @author 3979434@qq.com */ -import com.farsunset.cim.server.model.ReplyBody; -import com.farsunset.cim.server.model.SentBody; -import com.farsunset.cim.server.session.CIMSession; +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.sdk.server.session.CIMSession; public interface CIMRequestHandler { diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/ServerKeepAliveFactoryImpl.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/ServerKeepAliveFactoryImpl.java similarity index 67% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/ServerKeepAliveFactoryImpl.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/ServerKeepAliveFactoryImpl.java index 85cebab..b9bf766 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/ServerKeepAliveFactoryImpl.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/ServerKeepAliveFactoryImpl.java @@ -1,9 +1,15 @@ -package com.farsunset.cim.server.handler; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.handler; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.keepalive.KeepAliveMessageFactory; -import com.farsunset.cim.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.constant.CIMConstant; public class ServerKeepAliveFactoryImpl implements KeepAliveMessageFactory { @Override @@ -23,7 +29,7 @@ public class ServerKeepAliveFactoryImpl implements KeepAliveMessageFactory { @Override public boolean isResponse(IoSession arg0, Object arg1) { - return CIMConstant.CMD_HEARTBEAT_RESPONSE.equals(arg1); + return CIMConstant.CMD_HEARTBEAT_RESPONSE.equalsIgnoreCase(arg1.toString()); } } diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMNioSocketAcceptor.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/launcher/CIMNioSocketAcceptor.java similarity index 83% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMNioSocketAcceptor.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/launcher/CIMNioSocketAcceptor.java index e276700..0a462da 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMNioSocketAcceptor.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/launcher/CIMNioSocketAcceptor.java @@ -1,4 +1,10 @@ -package com.farsunset.cim.server.handler; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.launcher; import java.io.IOException; import java.net.InetSocketAddress; @@ -17,21 +23,24 @@ import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.DefaultSocketSessionConfig; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; +import com.farsunset.cim.sdk.server.handler.ServerKeepAliveFactoryImpl; + public class CIMNioSocketAcceptor { IoAcceptor acceptor; IoHandler ioHandler; int port; - private final int IDLE_TIME = 60;//秒 - private final int TIME_OUT = 30;//秒 + private final int IDLE_TIME = 300;//秒 + private final int TIME_OUT = 10;//秒 public void bind() throws IOException { acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig().setReadBufferSize(1024); ((DefaultSocketSessionConfig)acceptor.getSessionConfig()).setTcpNoDelay(true); + acceptor.getSessionConfig().setBothIdleTime(IDLE_TIME); acceptor.getFilterChain().addLast("executor",new ExecutorFilter()); acceptor.getFilterChain().addLast("logger",new LoggingFilter()); - acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new com.farsunset.cim.server.filter.ServerMessageCodecFactory())); + acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new com.farsunset.cim.sdk.server.filter.ServerMessageCodecFactory())); KeepAliveMessageFactory heartBeatFactory = new ServerKeepAliveFactoryImpl(); KeepAliveFilter keepAliveFilter = new KeepAliveFilter(heartBeatFactory,IdleStatus.BOTH_IDLE,KeepAliveRequestTimeoutHandler.CLOSE,IDLE_TIME,TIME_OUT); keepAliveFilter.setForwardEvent(true); diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/Message.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/Message.java similarity index 68% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/Message.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/Message.java index 6151306..166b73a 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/Message.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/Message.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0.0 * * @author 3979434@qq.com */ -package com.farsunset.cim.server.model; +package com.farsunset.cim.sdk.server.model; import java.io.Serializable; /** @@ -137,28 +137,54 @@ public class Message implements Serializable { this.format = format; } - public String toString() - { - + public String toString() { + StringBuffer buffer = new StringBuffer(); buffer.append(""); buffer.append(""); buffer.append("").append(mid).append(""); - buffer.append("").append(type).append(""); - buffer.append("").append(this.getTitle()==null?"":this.getTitle()).append(""); - buffer.append(""); - buffer.append("").append(this.getFile()==null?"":this.getFile()).append(""); - buffer.append("").append(this.getFileType()==null?"":this.getFileType()).append(""); - buffer.append("").append(this.getSender()==null?"":this.getSender()).append(""); - buffer.append("").append(this.getReceiver()==null?"":this.getReceiver()).append(""); - buffer.append("").append(this.getFormat()==null?"":this.getFormat()).append(""); - buffer.append("").append(timestamp).append(""); + + if (isNotEmpty(type)) { + buffer.append("").append(type).append(""); + } + + if (isNotEmpty(title)) { + buffer.append("").append(title).append(""); + } + if (isNotEmpty(content)) { + buffer.append(""); + } + + if (isNotEmpty(file)) { + buffer.append("").append(file).append(""); + } + + if (isNotEmpty(fileType)) { + buffer.append("").append(fileType).append(""); + } + + if (isNotEmpty(sender)) { + buffer.append("").append(sender).append(""); + } + + if (isNotEmpty(receiver)) { + buffer.append("").append(receiver).append(""); + } + + if (isNotEmpty(format)) { + buffer.append("").append(format).append(""); + } + + if (timestamp > 0) { + buffer.append("").append(timestamp).append(""); + } + buffer.append(""); return buffer.toString(); } - public String toXmlString() - { - + + public String toXmlString() { + return toString(); } @@ -169,6 +195,10 @@ public class Message implements Serializable { public void setMid(String mid) { this.mid = mid; } - + + public boolean isNotEmpty(String txt) { + return txt != null && !txt.isEmpty(); + } + } diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/ReplyBody.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/ReplyBody.java similarity index 95% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/ReplyBody.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/ReplyBody.java index 49bd647..050d57c 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/ReplyBody.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/ReplyBody.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.model; + */ +package com.farsunset.cim.sdk.server.model; import java.io.Serializable; import java.util.HashMap; diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/SentBody.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/SentBody.java similarity index 94% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/SentBody.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/SentBody.java index aa9bdb7..cd5d2d1 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/model/SentBody.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/SentBody.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.model; + */ +package com.farsunset.cim.sdk.server.model; import java.io.Serializable; import java.util.HashMap; diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/CIMSession.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/CIMSession.java similarity index 83% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/CIMSession.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/CIMSession.java index 5fdbafa..628f255 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/CIMSession.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/CIMSession.java @@ -1,10 +1,10 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com - */ -package com.farsunset.cim.server.session; + */ +package com.farsunset.cim.sdk.server.session; import java.io.Serializable; import java.net.InetAddress; @@ -13,7 +13,7 @@ import java.net.UnknownHostException; import org.apache.mina.core.session.IoSession; -import com.farsunset.cim.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.constant.CIMConstant; /** * IoSession包装类,集群时 将此对象存入表中 @@ -27,8 +27,8 @@ public class CIMSession implements Serializable{ private transient static final long serialVersionUID = 1L; public transient static String ID = "ID"; public transient static String HOST = "HOST"; - public transient static final int STATUS_ENABLE=0; - public transient static final int STATUS_DISENABLE=1; + public transient static final int STATUS_ENABLED = 0; + public transient static final int STATUS_DISABLED = 1; public transient static final int APNS_ON=1; public transient static final int APNS_OFF=0; @@ -40,7 +40,7 @@ public class CIMSession implements Serializable{ private transient IoSession session; private String gid;//session全局ID - private Long nid;//session在本台服务器上的ID + private long nid;//session在本台服务器上的ID private String deviceId;//客户端ID (设备号码+应用包名),ios为devicetoken private String host;//session绑定的服务器IP private String account;//session绑定的账号 @@ -48,6 +48,7 @@ public class CIMSession implements Serializable{ private String deviceModel;//终端设备型号 private String clientVersion;//终端应用版本 private String systemVersion;//终端系统版本 + private String packageName;//终端应用包名 private Long bindTime;//登录时间 private Long heartbeat;//心跳时间 private Double longitude;//经度 @@ -216,6 +217,8 @@ public class CIMSession implements Serializable{ setAttribute("host", host); } + + public int getApnsAble() { return apnsAble; @@ -265,16 +268,26 @@ public class CIMSession implements Serializable{ return null; } - public void write(Object msg) { + public boolean write(Object msg) { if(session!=null) { - session.write(msg).isWritten(); + return session.write(msg).isWritten(); } + + return false; } public boolean isConnected() { - if(session!=null) - return session.isConnected(); + if(session != null && isLocalhost()) + { + return session.isConnected(); + } + + if(!isLocalhost()) + { + return status == STATUS_ENABLED; + } + return false; } @@ -292,25 +305,56 @@ public class CIMSession implements Serializable{ } - public void close(boolean immediately) { + public void closeNow() { if(session!=null) - session.close(immediately); + session.closeNow(); } - + public void closeOnFlush() { + if(session!=null) + session.closeOnFlush(); + } + + + public void setPackageName(String packageName) { + this.packageName = packageName; + setAttribute("packageName", apnsAble); + } + + public String getPackageName() { + return packageName; + } public boolean equals(Object o) { if (o instanceof CIMSession) { CIMSession t = (CIMSession) o; - if(t.deviceId!=null && deviceId!=null && t.nid!=null && nid!=null) + if(t.deviceId!=null && deviceId!=null) { - return t.deviceId.equals(deviceId) && t.nid.longValue()==nid.longValue() && t.host.equals(host); + return t.deviceId.equals(deviceId) && t.nid == nid && t.host.equals(host); } } return false; } + public boolean fromOtherDevice(Object o) { + + if (o instanceof CIMSession) { + + CIMSession t = (CIMSession) o; + if(t.deviceId!=null && deviceId!=null) + { + return !t.deviceId.equals(deviceId); + } + } + return false; + } + + public boolean fromCurrentDevice(Object o) { + + return !fromOtherDevice(o); + } + public void setIoSession(IoSession session) { this.session = session; } @@ -342,5 +386,6 @@ public class CIMSession implements Serializable{ } + } \ No newline at end of file diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/DefaultSessionManager.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/DefaultSessionManager.java similarity index 71% rename from cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/DefaultSessionManager.java rename to cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/DefaultSessionManager.java index 29efffe..335d585 100644 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/DefaultSessionManager.java +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/DefaultSessionManager.java @@ -1,16 +1,16 @@ /** - * probject:cim-core - * @version 1.5.0 + * probject:cim-server-sdk + * @version 2.0 * * @author 3979434@qq.com */ -package com.farsunset.cim.server.session; - -import java.util.Collection; +package com.farsunset.cim.sdk.server.session; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import com.farsunset.cim.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.constant.CIMConstant; /** * 自带默认 session管理实现, 各位可以自行实现 AbstractSessionManager接口来实现自己的 session管理 @@ -29,7 +29,7 @@ public class DefaultSessionManager implements SessionManager{ /** * */ - public void addSession(String account,CIMSession session) { + public void add(String account,CIMSession session) { if(session!=null) { session.setAttribute(CIMConstant.SESSION_KEY, account); @@ -40,7 +40,7 @@ public class DefaultSessionManager implements SessionManager{ } - public CIMSession getSession(String account) { + public CIMSession get(String account) { return sessions.get(account); @@ -49,18 +49,20 @@ public class DefaultSessionManager implements SessionManager{ - public Collection getSessions() { - return sessions.values(); + public List queryAll() { + List list = new ArrayList(); + list.addAll(sessions.values()); + return list; } - public void removeSession(CIMSession session) { + public void remove(CIMSession session) { sessions.remove(session.getAttribute(CIMConstant.SESSION_KEY)); } - public void removeSession(String account) { + public void remove(String account) { sessions.remove(account); @@ -94,14 +96,15 @@ public class DefaultSessionManager implements SessionManager{ @Override - public void updateSession(CIMSession session) { + public void update(CIMSession session) { sessions.put(session.getAccount(), session); } @Override - public void setInvalid(String account) { - sessions.get(account).setStatus(CIMSession.STATUS_DISENABLE); + public void setState(String account,int state) { + sessions.get(account).setStatus(state); } + } diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/SessionManager.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/SessionManager.java new file mode 100644 index 0000000..a46e32b --- /dev/null +++ b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/SessionManager.java @@ -0,0 +1,55 @@ +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.session; + +import java.util.List; + + +/** + * 客户端的 session管理接口 + * 可自行实现此接口管理session + */ + +public interface SessionManager { + + + /** + * 添加新的session + */ + public void add(String account,CIMSession session); + + /** + * 更新session + */ + public void update(CIMSession session); + + /** + * + * @param account 客户端session的 key 一般可用 用户账号来对应session + * @return + */ + CIMSession get(String account); + + /** + * 获取所有session + * @return + */ + public List queryAll(); + + + /** + * 删除session + * @param session + */ + public void remove(String account); + + /** + * 设置session失效 + * @param session + */ + public void setState(String account,int state); +} \ No newline at end of file diff --git a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/SessionManager.java b/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/SessionManager.java deleted file mode 100644 index b565bf6..0000000 --- a/cim_for_mina/cim-server-sdk/src/com/farsunset/cim/server/session/SessionManager.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * probject:cim-core - * @version 1.5.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.server.session; - -import java.util.Collection; - - -/** - * 客户端的 session管理接口 - * 可自行实现此接口管理session - */ - -public interface SessionManager { - - - /** - * 添加新的session - */ - public void addSession(String account,CIMSession session); - - /** - * 添加新的session - */ - public void updateSession(CIMSession session); - - /** - * - * @param account 客户端session的 key 一般可用 用户账号来对应session - * @return - */ - CIMSession getSession(String account); - - /** - * 获取所有session - * @return - */ - public Collection getSessions(); - - - /** - * 删除session - * @param session - */ - public void removeSession(String account); - - /** - * 删除session - * @param session - */ - public void setInvalid(String account); - - /** - * session是否存在 - * @param session - */ - public boolean containsCIMSession(String account); - - -} \ No newline at end of file diff --git a/cim_for_mina/cim-server/.classpath b/cim_for_mina/cim-server/.classpath index 233d582..a323a94 100644 --- a/cim_for_mina/cim-server/.classpath +++ b/cim_for_mina/cim-server/.classpath @@ -30,8 +30,6 @@ - - @@ -39,5 +37,6 @@ + diff --git a/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/log4j.properties b/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/log4j.properties index b0801a7..b0572a1 100644 --- a/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/log4j.properties +++ b/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/log4j.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=warn,console, file +log4j.rootLogger=debug,console, file #----------console---------------- log4j.appender.console=org.apache.log4j.ConsoleAppender diff --git a/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml b/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml index 8676e13..cf3a4e0 100644 --- a/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml +++ b/cim_for_mina/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml @@ -12,21 +12,8 @@ http://www.springframework.org/schema/aop/spring-aop-2.5.xsd " > - - - - - - - - - - - - - - - + + @@ -50,13 +37,13 @@ - - + - - - - - - - - - - - - - + + @@ -50,13 +37,13 @@ - - + - + @@ -60,12 +60,12 @@ - + + - + - diff --git a/cim_for_mina/client-mchat-android/libs/cim-android-sdk-2.0.jar b/cim_for_mina/client-mchat-android/libs/cim-android-sdk-2.0.jar index 09177d3..1d48efd 100644 Binary files a/cim_for_mina/client-mchat-android/libs/cim-android-sdk-2.0.jar and b/cim_for_mina/client-mchat-android/libs/cim-android-sdk-2.0.jar differ diff --git a/cim_for_mina/client-mchat-android/libs/fastjson-1.1.34.android.jar b/cim_for_mina/client-mchat-android/libs/fastjson-1.1.34.android.jar deleted file mode 100644 index bf50c46..0000000 Binary files a/cim_for_mina/client-mchat-android/libs/fastjson-1.1.34.android.jar and /dev/null differ diff --git a/cim_for_mina/client-mchat-android/libs/fastjson-1.1.47.android.jar b/cim_for_mina/client-mchat-android/libs/fastjson-1.1.47.android.jar new file mode 100644 index 0000000..9062508 Binary files /dev/null and b/cim_for_mina/client-mchat-android/libs/fastjson-1.1.47.android.jar differ diff --git a/cim_for_mina/client-mchat-android/libs/mina-core-2.0.9.jar b/cim_for_mina/client-mchat-android/libs/mina-core-2.0.9.jar deleted file mode 100644 index be1746c..0000000 Binary files a/cim_for_mina/client-mchat-android/libs/mina-core-2.0.9.jar and /dev/null differ diff --git a/cim_for_mina/client-mchat-android/libs/slf4j-api-1.7.5.jar b/cim_for_mina/client-mchat-android/libs/slf4j-api-1.7.5.jar deleted file mode 100644 index 8766455..0000000 Binary files a/cim_for_mina/client-mchat-android/libs/slf4j-api-1.7.5.jar and /dev/null differ diff --git a/cim_for_mina/client-mchat-android/libs/slf4j-nop-1.7.5.jar b/cim_for_mina/client-mchat-android/libs/slf4j-nop-1.7.5.jar deleted file mode 100644 index e55bdd8..0000000 Binary files a/cim_for_mina/client-mchat-android/libs/slf4j-nop-1.7.5.jar and /dev/null differ diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java index ac1fc61..a60ef9a 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java @@ -1,8 +1,14 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.adapter; import java.util.Comparator; -import com.farsunset.cim.client.model.Message; +import com.farsunset.cim.sdk.android.model.Message; public class MessageTimeDescComparator implements Comparator{ diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java index 2dd2872..266b324 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java @@ -1,17 +1,22 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.adapter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; - +import android.annotation.SuppressLint; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; - -import com.farsunset.cim.client.model.Message; +import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.ichat.example.R; import com.farsunset.ichat.example.ui.SystemMessageActivity; @@ -48,12 +53,12 @@ public class SystemMsgListViewAdapter extends BaseAdapter { { //Collections.sort(list, new MessageTimeDescComparator()); } + @SuppressLint("ViewHolder") @Override public View getView(int position, View chatItemView, ViewGroup parent) { final Message msg = getItem(position); - chatItemView =LayoutInflater.from(scactivity).inflate(R.layout.item_chat_sysmsg, null); diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java index a3021e4..560da3a 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java @@ -1,17 +1,22 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.app; +import com.farsunset.cim.sdk.android.CIMEventListener; +import com.farsunset.cim.sdk.android.CIMListenerManager; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; import android.app.Activity; import android.net.NetworkInfo; import android.os.Bundle; -import com.farsunset.cim.client.android.CIMEventListener; -import com.farsunset.cim.client.android.CIMListenerManager; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; - -public abstract class CIMMonitorActivity extends Activity implements CIMEventListener{ +public abstract class CIMMonitorActivity extends Activity implements CIMEventListener{ CommonBaseControl commonBaseControl; @@ -56,28 +61,30 @@ public abstract class CIMMonitorActivity extends Activity implements CIMEventL + + @Override + public void onMessageReceived(Message arg0){}; + + @Override + public void onNetworkChanged(NetworkInfo info){} + /** * 与服务端断开连接时回调,不要在里面做连接服务端的操作 */ - @Override - public void onCIMConnectionSucceed() {} + public void onConnectionClosed() {} + /** - * 连接服务端成功时回调 - */ + * 连接服务端成功时回调 + */ @Override - public void onCIMConnectionClosed() {} - @Override - public void onConnectionStatus(boolean isConnected){} + public void onConnectionSuccessed(boolean arg0) {} + @Override - public void onReplyReceived(ReplyBody reply) {} - + public void onReplyReceived(ReplyBody arg0) {} @Override - public void onMessageReceived(Message arg0) {} - - @Override - public void onNetworkChanged(NetworkInfo info){}; + public void onConnectionFailed(Exception e){}; } diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java index 87b872a..56d7a79 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java @@ -1,3 +1,9 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.app; diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java index af846e5..921b44e 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java @@ -1,18 +1,15 @@ -package com.farsunset.ichat.example.app; - - - - - - /** + * probject:cim + * @version 2.0 * - * @version 1.0 - */ + * @author 3979434@qq.com + */ +package com.farsunset.ichat.example.app; + public interface Constant { //服务端IP地址 - public static final String CIM_SERVER_HOST = "192.168.2.3"; + public static final String CIM_SERVER_HOST = "192.168.2.2"; //服务端web地址 public static final String SERVER_URL = "http://"+CIM_SERVER_HOST+":8080/cim-server"; diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java index 25513a8..5ddad4d 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java @@ -1,10 +1,13 @@ - +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.network; import java.io.File; -import java.lang.reflect.Type; import java.nio.charset.Charset; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -20,18 +23,13 @@ import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.util.EntityUtils; - import android.os.Handler; import android.os.Message; - import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; public class HttpAPIRequester { HttpAPIResponser responser; - Type dataType; - Type dataListType; private static BlockingQueue queue = new LinkedBlockingQueue(); private static ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 20, TimeUnit.SECONDS,queue);; @@ -72,41 +70,20 @@ public class HttpAPIRequester { * @exception * @since 1.0.0 */ - public void execute( Type dtype , Type dltype, final String url) + public void execute( final String url) { - this.dataType = dtype; - this.dataListType = dltype; responser.onRequest(); executor.execute(new Runnable() { @Override public void run() { Message message = handler.obtainMessage(); - HashMap data = new HashMap(); + message.getData().putString("url", url); try { String dataString = httpPost(url,responser.getRequestParams()); - JSONObject json = JSON.parseObject(dataString); - data.put("code", json.getString("code")); - data.put("url", url); - if(json.containsKey("data") && dataType!=null) - { - dataString = json.getJSONObject("data").toJSONString(); - data.put("data", JSON.parseObject(dataString, dataType)); - } - if(json.containsKey("dataList") &&dataListType!=null ) - { - dataString = json.getJSONArray("dataList").toJSONString(); - data.put("list", JSON.parseObject(dataString, dataListType)); - } - - if(json.containsKey("page") &&json.getJSONObject("page")!=null) - { - dataString = json.getJSONObject("page").toJSONString(); - data.put("page", JSON.parseObject(dataString, Page.class)); - } - message.getData().putSerializable("data", data); + message.getData().putString("data", dataString); message.what = 0; } catch (Exception e) { e.printStackTrace(); @@ -157,18 +134,16 @@ public class HttpAPIRequester { Handler handler = new Handler(){ public void handleMessage(Message message) { - switch(message.what) + String url = message.getData().getString("url"); + switch(message.what) { case 0: - HashMap data =(HashMap) message.getData().getSerializable("data"); - Page page = (Page) data.get("page"); - List list = (List) data.get("list"); - String code = String.valueOf(data.get("code")); - responser.onSuccess(data.get("data"),list,page,String.valueOf(data.get("code")),data.get("url").toString()); + String data = message.getData().getString("data"); + responser.onSuccess(data,url); break; case 1: - responser.onFailed((Exception) message.getData().get("exception")); + responser.onFailed((Exception) message.getData().get("exception"),url); break; } diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java index c9edeb1..a59b8d2 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java @@ -1,13 +1,17 @@ - +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.network; -import java.util.List; import java.util.Map; public interface HttpAPIResponser { - public void onSuccess(Object data,List list,Page page,String code,String url); - public void onFailed(Exception e); + public void onSuccess(String resulet,String url); + public void onFailed(Exception e,String url); public Map getRequestParams(); public void onRequest(); } diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/Page.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/Page.java deleted file mode 100644 index 13f2c3e..0000000 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/network/Page.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.farsunset.ichat.example.network; - -import java.io.Serializable; - -public class Page implements Serializable -{ - - /** - * serialVersionUID:TODO(用一句话描述这个变量表示什么) - * - * @since 1.0.0 - */ - private static final long serialVersionUID = 1L; - public int count; - public int size; - public int currentPage; - public int countPage; -} diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java index 4f5859c..4440f83 100644 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java +++ b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java @@ -1,3 +1,9 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.receiver; @@ -7,12 +13,11 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.NetworkInfo; -import android.util.Log; -import com.farsunset.cim.client.android.CIMEventBroadcastReceiver; -import com.farsunset.cim.client.android.CIMListenerManager; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; +import com.farsunset.cim.sdk.android.CIMEventBroadcastReceiver; +import com.farsunset.cim.sdk.android.CIMListenerManager; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; import com.farsunset.ichat.example.R; import com.farsunset.ichat.example.ui.SystemMessageActivity; @@ -29,45 +34,22 @@ public final class CustomCIMMessageReceiver extends CIMEventBroadcastReceiver { //当收到消息时,会执行onMessageReceived,这里是消息第一入口 @Override - public void onMessageReceived(com.farsunset.cim.client.model.Message message) { + public void onMessageReceived(Message message) { - - for (int index = 0 ;index(){}.getType(), null, SEND_MESSAGE_API_URL); + requester.execute(SEND_MESSAGE_API_URL); } @Override - public void onSuccess(Object data, List list, Page page, String code,String url) { + public void onSuccess(String data,String url) { hideProgressDialog(); - - if(CIMConstant.ReturnCode.CODE_200.equals(code)) - { - showToask("发送成功"); - } + showToask("发送成功"); } @@ -163,7 +159,7 @@ public class SystemMessageActivity extends CIMMonitorActivity implements OnClick } @Override - public void onFailed(Exception e) {} + public void onFailed(Exception e,String url) {} @Override public void onBackPressed() { diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/util/FileDownloader.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/util/FileDownloader.java deleted file mode 100644 index cae709c..0000000 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/util/FileDownloader.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.farsunset.ichat.example.util; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.HashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; - -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - -/** - * 文件下载器 每秒2次跟新进度 - * - * @author Administrator - * - */ -public class FileDownloader { - - private DownloadHandler handler; - private static FileDownloader fileDownloader; - private static FileDownloadCallBack downloadCallBack; - private ThreadPoolExecutor downloadExecutor;// 下载线程执行器 - public static final int STATUS_STOP = 1; - - public static final int STATUS_AWAIT = 3; - public static final int STATUS_FAILED = 4; - public static final int STATUS_DONE = 200; - public static final int STATUS_RUNING = 0; - // 每个下载线程的状态记录 - private static HashMap STATUS_MAP = new HashMap(); - - // 每个文件的大小 byte - private static HashMap FILE_SIZE_MAP = new HashMap(); - - - // 每个下载线程的进度大小(byte) - private static HashMap PROGRESS_MAP = new HashMap(); - - private FileDownloader() { - - handler = new DownloadHandler(); - //支持3个线程同时下载 - downloadExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(3); - } - - public synchronized static FileDownloader getInstance() { - if (fileDownloader == null) { - fileDownloader = new FileDownloader(); - } - return fileDownloader; - } - - public String download(final String fileUrl, final File file) { - // 创建线程key - final String threadKey = fileUrl; - - // 创建下载任务,当运行的任务线程已经满了,则会等待,直到有下载线程完成 - downloadExecutor.execute(new Runnable() { - @Override - public void run() { - - STATUS_MAP.put(threadKey, STATUS_RUNING); - - HttpURLConnection conn = null; - InputStream is = null; - FileOutputStream fos = null; - - Message msg = new Message(); - Bundle bundle = new Bundle(); - bundle.putString("threadKey", threadKey); - msg.setData(bundle); - - try { - URL fielURL = new URL(fileUrl); - conn = (HttpURLConnection) fielURL.openConnection(); - - FILE_SIZE_MAP.put(threadKey, (long)conn.getContentLength()); - - if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { - msg.what = STATUS_FAILED; - handler.sendMessage(msg); - return; - } - - is = conn.getInputStream(); - fos = new FileOutputStream(file); - - - - PROGRESS_MAP.put(threadKey, 0l); - handler.sendMessageDelayed(msg, 200); - - byte buf[] = new byte[1024]; - int numread; - long downloadSize = 0; - - while ((numread = is.read(buf)) != -1) { - if (STATUS_MAP.get(threadKey) == STATUS_STOP) { - - msg = new Message(); - msg.what = STATUS_STOP; - handler.sendMessage(msg); - break; - } - fos.write(buf, 0, numread); - downloadSize += numread; - - PROGRESS_MAP.put(threadKey, downloadSize); - } - } catch (Exception e) { - - msg = new Message(); - msg.what = STATUS_FAILED; - handler.sendMessage(msg); - e.printStackTrace(); - } finally { - - try { - is.close(); - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - conn.disconnect(); - } - - STATUS_MAP.put(threadKey, STATUS_DONE); - } - }); - - - return threadKey; - } - - - /** - * 通过任务名称,停止下载 threadKey download()返回的任务名 - */ - public void setOnDownloadCallBack(FileDownloadCallBack callBack) { - downloadCallBack = callBack; - } - - /** - * 通过任务名称,停止下载 threadKey download()返回的任务名 - */ - public void stop(String threadKey) { - STATUS_MAP.put(threadKey, STATUS_STOP); - } - - - /** - * 停止所有下载任务 - */ - public void stopAll() { - for (String threadKey : STATUS_MAP.keySet()) { - stop(threadKey); - } - - } - - /** - * 停止所有下载任务 - */ - public void shutdown() { - downloadExecutor.shutdown(); - } - /** - * 销毁下载器 - */ - public void destroy() { - stopAll(); - downloadExecutor.shutdown(); - downloadExecutor = null; - fileDownloader = null; - } - - static class DownloadHandler extends Handler { - - private DownloadHandler() { - super(Looper.getMainLooper()); - } - - @Override - public void dispatchMessage(Message message) { - String threadKey = message.getData().getString("threadKey"); - switch (message.what) { - case STATUS_RUNING: - - downloadCallBack.progress(threadKey, FILE_SIZE_MAP.get(threadKey), PROGRESS_MAP.get(threadKey)); - - message = this.obtainMessage(); - message.getData().putString("threadKey", threadKey); - if(FILE_SIZE_MAP.get(threadKey).equals(PROGRESS_MAP.get(threadKey)) || STATUS_MAP.get(threadKey).equals(STATUS_DONE)) - { - message.what = STATUS_DONE; - } - - this.sendMessageDelayed(message, 200); - break; - case STATUS_STOP: - - downloadCallBack.statusChange(threadKey, STATUS_STOP); - break; - case STATUS_FAILED: - - downloadCallBack.statusChange(threadKey, STATUS_FAILED); - break; - case STATUS_DONE: - downloadCallBack.progress(threadKey, FILE_SIZE_MAP.get(threadKey), FILE_SIZE_MAP.get(threadKey)); - PROGRESS_MAP.remove(threadKey); - STATUS_MAP.remove(threadKey); - FILE_SIZE_MAP.remove(threadKey); - break; - } - - } - } - - public static interface FileDownloadCallBack { - public abstract void progress(String threadKey, long fileSize,long downloadSize); - public abstract void statusChange(String threadKey, int status); - } -} diff --git a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/util/StringUtil.java b/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/util/StringUtil.java deleted file mode 100644 index fe3806d..0000000 --- a/cim_for_mina/client-mchat-android/src/com/farsunset/ichat/example/util/StringUtil.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.farsunset.ichat.example.util; - -import java.text.SimpleDateFormat; -import java.util.Date; - -import android.content.Context; -import android.telephony.TelephonyManager; - - -public class StringUtil { - - - public static boolean isEmpty(Object obj) - { - - return null == obj || "".equals(obj.toString().trim()); - } - - public static boolean isNotEmpty(Object obj) - { - - return !isEmpty(obj); - } - public static String getSequenceId() - { - String mark = String.valueOf(System.currentTimeMillis()); - return mark; - } - - public static String getCurrentlyDateTime() { - SimpleDateFormat dateFormat = new SimpleDateFormat( - "yyyyMMddHHmmss"); - return dateFormat.format(new Date()); - } - - public static String transformDateTime(long t) { - Date date = new Date(t); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - return dateFormat.format(date); - } - - public static String getCurrentlyDate() { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); - return dateFormat.format(new Date()); - } - - public static String getIMEI(Context context) - { - return ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); - - } -} diff --git a/cim_for_netty/cim-android-sdk/.classpath b/cim_for_netty/cim-android-sdk/.classpath index a9e92ae..24c8e68 100644 --- a/cim_for_netty/cim-android-sdk/.classpath +++ b/cim_for_netty/cim-android-sdk/.classpath @@ -3,6 +3,10 @@ - + + + + + diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMCacheTools.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMCacheTools.java deleted file mode 100644 index b629023..0000000 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMCacheTools.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * probject:cim-android-sdk - * @version 2.0.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.client.android; - -import android.content.Context; - - class CIMCacheTools { - - - public static String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; - - public static String KEY_ACCOUNT = "KEY_ACCOUNT"; - - public static String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; - - public static String KEY_CIM_DESTORYED = "KEY_CIM_DESTORYED"; - - public static String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; - - public static String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; - - - public static void putString(Context context,String key,String value) - { - context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).edit().putString(key, value).commit(); - } - - public static String getString(Context context,String key) - { - return context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).getString(key,null); - } - - public static void putBoolean(Context context,String key,boolean value) - { - context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).edit().putBoolean(key, value).commit(); - } - - public static boolean getBoolean(Context context,String key) - { - return context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).getBoolean(key,false); - } - - - public static void putInt(Context context,String key,int value) - { - context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).edit().putInt(key, value).commit(); - } - - public static int getInt(Context context,String key) - { - return context.getSharedPreferences(CIM_CONFIG_INFO, Context.MODE_PRIVATE).getInt(key,0); - } -} diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventListener.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventListener.java deleted file mode 100644 index 146a8a1..0000000 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventListener.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * probject:cim-android-sdk - * @version 2.0.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.client.android; - -import android.net.NetworkInfo; - -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; - -/** - *CIM 主要事件接口 - */ -public interface CIMEventListener -{ - - - /** - * 当收到服务端推送过来的消息时调用 - * @param message - */ - public void onMessageReceived(Message message); - - /** - * 当调用CIMPushManager.sendRequest()向服务端发送请求,获得相应时调用 - * @param replybody - */ - public void onReplyReceived(ReplyBody replybody); - - /** - * 当手机网络发生变化时调用 - * @param networkinfo - */ - public void onNetworkChanged(NetworkInfo networkinfo); - - /** - * 获取到是否连接到服务端 - * 通过调用CIMPushManager.detectIsConnected()来异步获取 - * - */ - public void onConnectionStatus(boolean isConnected); - - /** - * 连接服务端成功 - */ - public void onCIMConnectionSucceed(); - - - /** - * 连接断开 - */ - public void onCIMConnectionClosed(); -} - diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushManager.java deleted file mode 100644 index 039cbc5..0000000 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushManager.java +++ /dev/null @@ -1,215 +0,0 @@ -/** - * probject:cim-android-sdk - * @version 2.0.0 - * - * @author 3979434@qq.com - */ -package com.farsunset.cim.client.android; -import java.util.UUID; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.telephony.TelephonyManager; - -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.model.SentBody; - -/** - * CIM 功能接口 - */ -public class CIMPushManager { - - static String ACTION_ACTIVATE_PUSH_SERVICE ="ACTION_ACTIVATE_PUSH_SERVICE"; - - static String ACTION_CONNECTION ="ACTION_CONNECTION"; - - static String ACTION_CONNECTION_STATUS ="ACTION_CONNECTION_STATUS"; - - static String ACTION_SENDREQUEST ="ACTION_SENDREQUEST"; - - static String ACTION_DISCONNECTION ="ACTION_DISSENDREQUEST"; - - static String ACTION_DESTORY ="ACTION_DESTORY"; - - static String SERVICE_ACTION ="SERVICE_ACTION"; - - static String KEY_SEND_BODY ="KEY_SEND_BODY"; - - static String KEY_CIM_CONNECTION_STATUS ="KEY_CIM_CONNECTION_STATUS"; - - /** - * 初始化,连接服务端,在程序启动页或者 在Application里调用 - * @param context - * @param ip - * @param port - */ - public static void init(Context context,String ip,int port){ - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED, false); - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP, false); - - CIMCacheTools.putString(context, CIMCacheTools.KEY_CIM_SERVIER_HOST, ip); - CIMCacheTools.putInt(context, CIMCacheTools.KEY_CIM_SERVIER_PORT, port); - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST, ip); - serviceIntent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, port); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_CONNECTION); - context.startService(serviceIntent); - - } - - protected static void init(Context context){ - - boolean isManualStop = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - - if(isManualStop || isManualDestory) - { - return ; - } - - String host = CIMCacheTools.getString(context, CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port =CIMCacheTools.getInt(context, CIMCacheTools.KEY_CIM_SERVIER_PORT); - - init(context,host,port); - - } - - - /** - * 设置一个账号登录到服务端 - * @param account 用户唯一ID - */ - public static void bindAccount(Context context,String account){ - - - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - if(isManualDestory || account==null || account.trim().length()==0) - { - return ; - } - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP, false); - CIMCacheTools.putString(context,CIMCacheTools.KEY_ACCOUNT, account); - - String imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); - imei += context.getPackageName(); - SentBody sent = new SentBody(); - sent.setKey(CIMConstant.RequestKey.CLIENT_BIND); - sent.put("account", account); - sent.put("deviceId",UUID.nameUUIDFromBytes(imei.getBytes()).toString().replaceAll("-", "")); - sent.put("channel", "android"); - sent.put("device",android.os.Build.MODEL); - sent.put("appVersion",getVersionName(context)); - sent.put("osVersion",android.os.Build.VERSION.RELEASE); - sendRequest(context,sent); - - - } - - - protected static void bindAccount(Context context){ - - - - String account = CIMCacheTools.getString(context,CIMCacheTools.KEY_ACCOUNT); - bindAccount(context,account); - } - - - - /** - * 发送一个CIM请求 - * @param context - * @body - */ - public static void sendRequest(Context context,SentBody body){ - - boolean isManualStop = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - - if(isManualStop || isManualDestory) - { - return ; - } - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(KEY_SEND_BODY, body); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_SENDREQUEST); - context.startService(serviceIntent); - - } - - /** - * 停止接受推送,将会退出当前账号登录,端口与服务端的连接 - * @param context - */ - public static void stop(Context context){ - - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - if(isManualDestory){ - return ; - } - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP, true); - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_DISCONNECTION); - context.startService(serviceIntent); - - } - - - /** - * 完全销毁CIM,一般用于完全退出程序,调用resume将不能恢复 - * @param context - */ - public static void destory(Context context){ - - - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED, true); - CIMCacheTools.putString(context,CIMCacheTools.KEY_ACCOUNT, null); - - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_DESTORY); - context.startService(serviceIntent); - - } - - - /** - * 重新恢复接收推送,重新连接服务端,并登录当前账号 - * @param context - */ - public static void resume(Context context){ - - boolean isManualDestory = CIMCacheTools.getBoolean(context,CIMCacheTools.KEY_CIM_DESTORYED); - if(isManualDestory){ - return ; - } - - bindAccount(context); - } - - public static void detectIsConnected(Context context){ - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(SERVICE_ACTION, ACTION_CONNECTION_STATUS); - context.startService(serviceIntent); - } - - - - private static String getVersionName(Context context) { - String versionName = null; - try { - PackageInfo mPackageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); - versionName = mPackageInfo.versionName; - } catch (NameNotFoundException e) { - } - return versionName; - } - -} \ No newline at end of file diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushService.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushService.java deleted file mode 100644 index 5fe5206..0000000 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMPushService.java +++ /dev/null @@ -1,97 +0,0 @@ - -package com.farsunset.cim.client.android; -import android.app.Service; -import android.content.Intent; -import android.os.IBinder; -import android.util.Log; - -import com.farsunset.cim.client.model.SentBody; - - -/** - * 与服务端连接服务 - * @author 3979434 - * - */ - public class CIMPushService extends Service { - - protected final static int DEF_CIM_PORT = 28888; - CIMConnectorManager manager; - @Override - public void onCreate() - { - manager = CIMConnectorManager.getManager(this.getApplicationContext()); - } - - - @Override - public int onStartCommand(Intent intent,int flags, int startId) { - - String action; - if(intent==null) - { - intent = new Intent(CIMPushManager.ACTION_CONNECTION); - String host = CIMCacheTools.getString(this, CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port =CIMCacheTools.getInt(this, CIMCacheTools.KEY_CIM_SERVIER_PORT); - intent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST, host); - intent.putExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, port); - } - - action = intent.getStringExtra(CIMPushManager.SERVICE_ACTION); - - if(CIMPushManager.ACTION_CONNECTION.equals(action)) - { - String host = intent.getStringExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port = intent.getIntExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, DEF_CIM_PORT); - manager.connect(host,port); - } - - if(CIMPushManager.ACTION_SENDREQUEST.equals(action)) - { - manager.send((SentBody) intent.getSerializableExtra(CIMPushManager.KEY_SEND_BODY)); - } - - if(CIMPushManager.ACTION_DISCONNECTION.equals(action)) - { - manager.closeSession(); - } - - if(CIMPushManager.ACTION_DESTORY.equals(action)) - { - manager.destroy(); - this.stopSelf(); - android.os.Process.killProcess(android.os.Process.myPid()); - } - - if(CIMPushManager.ACTION_CONNECTION_STATUS.equals(action)) - { - manager.deliverIsConnected(); - } - - if(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action)) - { - - if(!manager.isConnected()) - { - Log.d(CIMPushService.class.getSimpleName(), "cimpush isConnected() = false "); - String host = intent.getStringExtra(CIMCacheTools.KEY_CIM_SERVIER_HOST); - int port = intent.getIntExtra(CIMCacheTools.KEY_CIM_SERVIER_PORT, DEF_CIM_PORT); - manager.connect(host,port); - }else - { - Log.d(CIMPushService.class.getSimpleName(), "isConnected() = true "); - } - } - - - return Service.START_REDELIVER_INTENT; - } - - - @Override - public IBinder onBind(Intent arg0) { - return null; - } - - -} diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java new file mode 100644 index 0000000..b4c62de --- /dev/null +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java @@ -0,0 +1,130 @@ +/** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; + +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +class CIMCacheToolkit extends SQLiteOpenHelper { + + private static final String DATABASE_NAME = "CIM_CONFIG_INFO.db"; + private static final int DATABASE_VERSION = 20160406; + + private static final String TABLE_SQL = "CREATE TABLE IF NOT EXISTS T_CIM_CONFIG (KEY VARCHAR(64) PRIMARY KEY,VALUE TEXT)"; + + private static final String DELETE_SQL = "DELETE FROM T_CIM_CONFIG WHERE KEY = ?"; + + private static final String SAVE_SQL = "INSERT INTO T_CIM_CONFIG (KEY,VALUE) VALUES(?,?)"; + + private static final String QUERY_SQL = "SELECT VALUE FROM T_CIM_CONFIG WHERE KEY = ?"; + + public static final String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; + + public static final String KEY_ACCOUNT = "KEY_ACCOUNT"; + + public static final String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; + + public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED"; + + public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; + + public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; + + public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE"; + + static CIMCacheToolkit toolkit; + public static CIMCacheToolkit getInstance(Context context){ + if (toolkit==null){ + toolkit = new CIMCacheToolkit(context); + } + return toolkit; + } + public CIMCacheToolkit(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + } + + public CIMCacheToolkit(Context context){ + this(context, DATABASE_NAME,null, DATABASE_VERSION); + } + + + + public void remove(String key) + { + SQLiteDatabase database = toolkit.getWritableDatabase(); + database.execSQL(DELETE_SQL,new String[]{key}); + database.close(); + toolkit.close(); + toolkit = null; + } + + + public void putString(String key,String value) + { + SQLiteDatabase database = toolkit.getWritableDatabase(); + database.execSQL(DELETE_SQL,new String[]{key}); + database.execSQL(SAVE_SQL, new String[]{key, value}); + database.close(); + + toolkit.close(); + toolkit = null; + + } + + public String getString(String key) + { + String value = null; + SQLiteDatabase database = toolkit.getWritableDatabase(); + Cursor cursor = database.rawQuery(QUERY_SQL, new String[]{key}); + if (cursor!=null&&cursor.moveToFirst()) + { + value = cursor.getString(0); + } + + cursor.close(); + database.close(); + toolkit.close(); + toolkit = null; + + return value; + } + + public void putBoolean(String key,boolean value) + { + putString(key,Boolean.toString(value)); + } + + public boolean getBoolean(String key) + { + String value = getString(key); + return value == null?false:Boolean.parseBoolean(value); + } + + + public void putInt(String key,int value) + { + putString(key, String.valueOf(value)); + } + + public int getInt(String key) + { + String value = getString(key); + return value == null?0:Integer.parseInt(value); + } + + @Override + public void onCreate(SQLiteDatabase database) { + database.execSQL(TABLE_SQL); + } + + @Override + public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { + + } +} diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMConnectorManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java similarity index 71% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMConnectorManager.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java index 410238b..a3cc71c 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMConnectorManager.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java @@ -1,4 +1,10 @@ -package com.farsunset.cim.client.android; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; @@ -12,6 +18,10 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.serialization.ClassResolvers; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.AttributeKey; import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; @@ -22,25 +32,25 @@ import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.util.Log; -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.exception.CIMSessionDisableException; -import com.farsunset.cim.client.exception.NetWorkDisableException; -import com.farsunset.cim.client.exception.WriteToClosedSessionException; -import com.farsunset.cim.client.filter.ClientMessageDecoder; -import com.farsunset.cim.client.filter.ClientMessageEncoder; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; -import com.farsunset.cim.client.model.SentBody; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.exception.CIMSessionDisableException; +import com.farsunset.cim.sdk.android.exception.NetWorkDisableException; +import com.farsunset.cim.sdk.android.exception.WriteToClosedSessionException; +import com.farsunset.cim.sdk.android.filter.ClientMessageDecoder; +import com.farsunset.cim.sdk.android.filter.ClientMessageEncoder; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; +import com.farsunset.cim.sdk.android.model.SentBody; /** * 连接服务端管理,cim核心处理类,管理连接,以及消息处理 - * - * @author 3979434@qq.com */ @io.netty.channel.ChannelHandler.Sharable class CIMConnectorManager extends SimpleChannelInboundHandler { + private final static String TAG = CIMConnectorManager.class.getSimpleName(); private Channel channel;; Context context; @@ -56,13 +66,13 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { public static final String ACTION_SENT_FAILED = "com.farsunset.cim.SENT_FAILED"; // 发送sendbody成功广播 - public static final String ACTION_SENT_SUCCESS = "com.farsunset.cim.SENT_SUCCESS"; + public static final String ACTION_SENT_SUCCESSED = "com.farsunset.cim.SENT_SUCCESSED"; // 链接意外关闭广播 public static final String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.CONNECTION_CLOSED"; // 链接失败广播 public static final String ACTION_CONNECTION_FAILED = "com.farsunset.cim.CONNECTION_FAILED"; // 链接成功广播 - public static final String ACTION_CONNECTION_SUCCESS = "com.farsunset.cim.CONNECTION_SUCCESS"; + public static final String ACTION_CONNECTION_SUCCESSED = "com.farsunset.cim.CONNECTION_SUCCESSED"; // 发送sendbody成功后获得replaybody回应广播 public static final String ACTION_REPLY_RECEIVED = "com.farsunset.cim.REPLY_RECEIVED"; // 网络变化广播 @@ -71,13 +81,17 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { // 未知异常 public static final String ACTION_UNCAUGHT_EXCEPTION = "com.farsunset.cim.UNCAUGHT_EXCEPTION"; - // CIM连接状态 - public static final String ACTION_CONNECTION_STATUS = "com.farsunset.cim.CONNECTION_STATUS"; - + //重试连接 + public final static String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY"; private ExecutorService executor; - - + public static final String HEARTBEAT_PINGED ="HEARTBEAT_PINGED"; + //连接空闲时间 + public static final int READ_IDLE_TIME = 180;//秒 + + //心跳超时 + public static final int HEART_TIME_OUT = 30 * 1000;//秒 + private CIMConnectorManager(Context ctx) { context = ctx; executor = Executors.newFixedThreadPool(3); @@ -85,17 +99,18 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { loopGroup = new NioEventLoopGroup(); bootstrap.group(loopGroup); bootstrap.channel(NioSocketChannel.class); + bootstrap.option(ChannelOption.TCP_NODELAY, true); bootstrap.handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new ClientMessageDecoder(ClassResolvers.cacheDisabled(null))); pipeline.addLast(new ClientMessageEncoder()); + pipeline.addLast(new IdleStateHandler(READ_IDLE_TIME,0,0)); pipeline.addLast(CIMConnectorManager.this); } }); - bootstrap.option(ChannelOption.TCP_NODELAY, true); } @@ -122,7 +137,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { intent.putExtra("exception", e); context.sendBroadcast(intent); - System.out.println("******************CIM连接服务器失败 "+cimServerHost+":"+cimServerPort); + Log.e(TAG,"******************CIM连接服务器失败 "+cimServerHost+":"+cimServerPort); } @@ -182,7 +197,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { }else { Intent intent = new Intent(); - intent.setAction(ACTION_SENT_SUCCESS); + intent.setAction(ACTION_SENT_SUCCESSED); intent.putExtra("sentBody", body); context.sendBroadcast(intent); } @@ -214,14 +229,6 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { return channel.isActive() ; } - public void deliverIsConnected() { - Intent intent = new Intent(); - intent.setAction(ACTION_CONNECTION_STATUS); - intent.putExtra(CIMPushManager.KEY_CIM_CONNECTION_STATUS, isConnected()); - context.sendBroadcast(intent); - } - - public void closeSession() { @@ -232,23 +239,48 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { } + /** + * 检测到连接空闲事件,发送心跳请求命令 + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + Log.e(TAG,"userEventTriggered:"+evt.toString()); + if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state().equals(IdleState.READER_IDLE)) + { + onReaderIdeled(ctx.channel()); + } + super.userEventTriggered(ctx, evt); + } + + + private void onReaderIdeled(Channel channel){ + + //如果心跳请求发出30秒内没收到响应,则关闭连接 + Long lastTime = (Long) channel.attr(AttributeKey.valueOf(HEARTBEAT_PINGED)).get(); + if(lastTime != null && System.currentTimeMillis() - lastTime > HEART_TIME_OUT) + { + channel.close(); + } + } @Override public void channelActive( ChannelHandlerContext ctx) throws Exception { - System.out.println("******************CIM连接服务器成功:"+ctx.channel().localAddress()); - - Intent intent = new Intent(); - intent.setAction(ACTION_CONNECTION_SUCCESS); - context.sendBroadcast(intent); + Log.i(TAG,"******************CIM连接服务器成功:"+ctx.channel().localAddress()); + + ctx.channel().attr(AttributeKey.valueOf(HEARTBEAT_PINGED)).set(System.currentTimeMillis()); + + Intent intent = new Intent(); + intent.setAction(ACTION_CONNECTION_SUCCESSED); + context.sendBroadcast(intent); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - System.out.println("******************closeCIM与服务器断开连接:"+ctx.channel().localAddress()); + Log.e(TAG,"******************closeCIM与服务器断开连接:"+ctx.channel().localAddress()); if(channel.id().asLongText().equals(ctx.channel().id().asLongText())) { Intent intent = new Intent(); @@ -269,8 +301,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { } @Override - protected void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception { - + protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof Message) { Intent intent = new Intent(); intent.setAction(ACTION_MESSAGE_RECEIVED); @@ -288,6 +319,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { //收到服务端发来的心跳请求命令,则马上回应服务器 if (msg.equals(CIMConstant.CMD_HEARTBEAT_REQUEST)) { ctx.writeAndFlush(CIMConstant.CMD_HEARTBEAT_RESPONSE); + ctx.channel().attr(AttributeKey.valueOf(HEARTBEAT_PINGED)).set(System.currentTimeMillis()); } } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventBroadcastReceiver.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java similarity index 66% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventBroadcastReceiver.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java index 9a68fa5..6c02e5b 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/android/CIMEventBroadcastReceiver.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java @@ -4,35 +4,34 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.android; +package com.farsunset.cim.sdk.android; -import java.util.List; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningTaskInfo; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.exception.CIMSessionDisableException; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; +import com.farsunset.cim.sdk.android.model.SentBody; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; - -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.exception.CIMSessionDisableException; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; -import com.farsunset.cim.client.model.SentBody; /** * 消息入口,所有消息都会经过这里 */ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver implements CIMEventListener { - public Context context; + @Override public void onReceive(Context ctx, Intent it) { context = ctx; + + /* * 操作事件广播,用于提高service存活率 @@ -61,11 +60,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl */ if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_CLOSED)) { - if(CIMConnectorManager.netWorkAvailable(context)) - { - CIMPushManager.init(context); - } - onCIMConnectionClosed(); + onInnerConnectionClosed(); } /* @@ -73,19 +68,15 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl */ if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_FAILED)) { - onConnectionFailed((Exception) it.getSerializableExtra("exception")); + onInnerConnectionFailed((Exception) it.getSerializableExtra("exception")); } /* * cim连接服务器成功事件 */ - if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_SUCCESS)) + if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_SUCCESSED)) { - - - CIMPushManager.bindAccount(context); - - onCIMConnectionSucceed(); + onInnerConnectionSuccessed(); } /* @@ -93,7 +84,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl */ if(it.getAction().equals(CIMConnectorManager.ACTION_MESSAGE_RECEIVED)) { - filterType999Message((Message)it.getSerializableExtra("message")); + onInnerMessageReceived((Message)it.getSerializableExtra("message")); } @@ -117,7 +108,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl /* * 获取sendbody发送成功事件 */ - if(it.getAction().equals(CIMConnectorManager.ACTION_SENT_SUCCESS)) + if(it.getAction().equals(CIMConnectorManager.ACTION_SENT_SUCCESSED)) { onSentSucceed((SentBody)it.getSerializableExtra("sentBody")); } @@ -131,60 +122,60 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl onUncaughtException((Exception)it.getSerializableExtra("exception")); } + /* - * 获取cim连接状态事件 + * 重新连接,如果断开的话 */ - if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_STATUS)) + if(it.getAction().equals(CIMConnectorManager.ACTION_CONNECTION_RECOVERY)) { - onConnectionStatus(it.getBooleanExtra(CIMPushManager.KEY_CIM_CONNECTION_STATUS, false)); + CIMPushManager.connect(context); } } - protected boolean isInBackground(Context context) { - List tasksInfo = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningTasks(1); - if (tasksInfo.size() > 0) { - - if (context.getPackageName().equals( - tasksInfo.get(0).topActivity.getPackageName())) { - - return false; - } - } - return true; - } - - private void startPushService() { Intent intent = new Intent(context, CIMPushService.class); - intent.putExtra(CIMPushManager.SERVICE_ACTION, CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE); + intent.setAction(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE); context.startService(intent); } + private void onInnerConnectionClosed(){ + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, false); + if(CIMConnectorManager.netWorkAvailable(context)) + { + CIMPushManager.connect(context); + } + + onConnectionClosed(); + } - - + Handler connectionHandler = new Handler(){ + @Override + public void handleMessage(android.os.Message message){ + CIMPushManager.connect(context); + } + }; - private void onConnectionFailed(Exception e){ + private void onInnerConnectionFailed(Exception e){ if(CIMConnectorManager.netWorkAvailable(context)) { - //间隔30秒后重连 - connectionHandler.sendMessageDelayed(connectionHandler.obtainMessage(), 30*1000); - } - } - - - Handler connectionHandler = new Handler() - { - @Override - public void handleMessage(android.os.Message message){ - - CIMPushManager.init(context); + connectionHandler.sendEmptyMessageDelayed(0, CIMConstant.RECONN_INTERVAL_TIME); } - }; + onConnectionFailed(e); + } + + + + + private void onInnerConnectionSuccessed(){ + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, true); + + boolean autoBind = CIMPushManager.autoBindAccount(context); + onConnectionSuccessed(autoBind); + } private void onUncaughtException(Throwable arg0) {} @@ -194,17 +185,17 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl if(info !=null) { - CIMPushManager.init(context); + CIMPushManager.connect(context); } onNetworkChanged(info); } - private void filterType999Message(com.farsunset.cim.client.model.Message message) + private void onInnerMessageReceived(com.farsunset.cim.sdk.android.model.Message message) { if(CIMConstant.MessageType.TYPE_999.equals(message.getType())) { - CIMCacheTools.putBoolean(context,CIMCacheTools.KEY_MANUAL_STOP,true); + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP,true); } onMessageReceived(message); @@ -215,7 +206,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl //与服务端端开链接,重新连接 if(e instanceof CIMSessionDisableException) { - CIMPushManager.init(context); + CIMPushManager.connect(context); }else { //发送失败 重新发送 @@ -225,15 +216,12 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver impl } private void onSentSucceed(SentBody body){} - @Override - public abstract void onMessageReceived(com.farsunset.cim.client.model.Message message); + public abstract void onMessageReceived(Message message); @Override public abstract void onReplyReceived(ReplyBody body); - public abstract void onNetworkChanged(NetworkInfo info); - - public abstract void onCIMConnectionSucceed(); + public abstract void onConnectionFailed(Exception e); + - public abstract void onCIMConnectionClosed(); } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java new file mode 100644 index 0000000..01f769e --- /dev/null +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java @@ -0,0 +1,57 @@ +/** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; + +import android.net.NetworkInfo; + +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; + +/** + *CIM 主要事件接口 + */ +public interface CIMEventListener +{ + + + /** + * 当收到服务端推送过来的消息时调用 + * @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); +} + diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMListenerManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java similarity index 59% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMListenerManager.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java index f2d2965..27eced5 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/android/CIMListenerManager.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java @@ -4,17 +4,21 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.android; +package com.farsunset.cim.sdk.android; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import com.farsunset.cim.client.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; +import android.net.NetworkInfo; +import android.util.Log; /** @@ -44,13 +48,53 @@ public class CIMListenerManager { } } - public static ArrayList getCIMListeners() { - return cimListeners; + + public static void notifyOnNetworkChanged(NetworkInfo info) { + for (CIMEventListener listener : cimListeners) { + listener.onNetworkChanged(info); + } } + public static void notifyOnConnectionSuccessed(boolean hasAutoBind) { + for (CIMEventListener listener : cimListeners) { + listener.onConnectionSuccessed(hasAutoBind); + } + } + public static void notifyOnMessageReceived(Message message) { + for (CIMEventListener listener : cimListeners) { + listener.onMessageReceived(message); + } + } + + public static void notifyOnConnectionClosed() { + for (CIMEventListener listener : cimListeners) { + listener.onConnectionClosed(); + } + } + public static void notifyOnReplyReceived(ReplyBody body) { + for (CIMEventListener listener : cimListeners) { + listener.onReplyReceived(body); + } + } + + public static void notifyOnConnectionFailed(Exception e) { + for (CIMEventListener listener : cimListeners) { + listener.onConnectionFailed(e); + } + } + + public static void destory() { + cimListeners.clear(); + } + + public static void logListenersName() { + for (CIMEventListener listener : cimListeners) { + Log.i(CIMEventListener.class.getSimpleName(),"#######" + listener.getClass().getName() + "#######" ); + } + } /** * 消息接收activity的接收顺序排序,CIM_RECEIVE_ORDER倒序 @@ -69,7 +113,7 @@ public class CIMListenerManager { Integer order1 = CIMConstant.CIM_DEFAULT_MESSAGE_ORDER; Integer order2 = CIMConstant.CIM_DEFAULT_MESSAGE_ORDER; ActivityInfo info; - if (arg1 instanceof Activity ) { + if (arg1 instanceof Activity ) { try { info = mcontext.getPackageManager() .getActivityInfo(((Activity)(arg1)).getComponentName(), PackageManager.GET_META_DATA); diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java new file mode 100644 index 0000000..295ecb0 --- /dev/null +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -0,0 +1,250 @@ +/** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; +import java.util.UUID; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.telephony.TelephonyManager; + +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.model.SentBody; + +/** + * CIM 功能接口 + */ +public class CIMPushManager { + + static String ACTION_ACTIVATE_PUSH_SERVICE ="ACTION_ACTIVATE_PUSH_SERVICE"; + + static String ACTION_CREATE_CIM_CONNECTION ="ACTION_CREATE_CIM_CONNECTION"; + + static String ACTION_SEND_REQUEST_BODY ="ACTION_SEND_REQUEST_BODY"; + + static String ACTION_CLOSE_CIM_CONNECTION ="ACTION_CLOSE_CIM_CONNECTION"; + + static String ACTION_DESTORY ="ACTION_DESTORY"; + + static String KEY_SEND_BODY ="KEY_SEND_BODY"; + + static String KEY_CIM_CONNECTION_STATUS ="KEY_CIM_CONNECTION_STATUS"; + + //被销毁的destroy() + public static final int STATE_DESTROYED = 0x0000DE; + //被销停止的 stop() + public static final int STATE_STOPED = 0x0000EE; + + public static final int STATE_NORMAL = 0x000000; + /** + * 初始化,连接服务端,在程序启动页或者 在Application里调用 + * @param context + * @param ip + * @param port + */ + public static void connect(Context context,String host,int port){ + + connect(context,host,port,false); + + } + +private static void connect(Context context,String ip,int port,boolean autoBind){ + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, false); + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); + + CIMCacheToolkit.getInstance(context).putString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); + CIMCacheToolkit.getInstance(context).putInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + + if(!autoBind) + { + CIMCacheToolkit.getInstance(context).remove(CIMCacheToolkit.KEY_ACCOUNT); + } + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); + serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION); + context.startService(serviceIntent); + + } + + protected static void connect(Context context){ + + boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + + if(isManualStop || isManualDestory) + { + return ; + } + + String host = CIMCacheToolkit.getInstance(context).getString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST); + int port =CIMCacheToolkit.getInstance(context).getInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + + connect(context,host,port,true); + + } + + + /** + * 设置一个账号登录到服务端 + * @param account 用户唯一ID + */ + public static void bindAccount(Context context,String account){ + + + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory || account==null || account.trim().length()==0) + { + return ; + } + sendBindRequest(context,account); + + } + + + private static void sendBindRequest(Context context, String account){ + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); + CIMCacheToolkit.getInstance(context).putString(CIMCacheToolkit.KEY_ACCOUNT, account); + + String imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); + imei += context.getPackageName(); + SentBody sent = new SentBody(); + sent.setKey(CIMConstant.RequestKey.CLIENT_BIND); + sent.put("account", account); + sent.put("deviceId",UUID.nameUUIDFromBytes(imei.getBytes()).toString().replaceAll("-", "")); + sent.put("channel", "android"); + sent.put("device",android.os.Build.MODEL); + sent.put("version",getVersionName(context)); + sent.put("osVersion",android.os.Build.VERSION.RELEASE); + sent.put("packageName",context.getPackageName()); + sendRequest(context,sent); + } + + protected static boolean autoBindAccount(Context context){ + + String account = CIMCacheToolkit.getInstance(context).getString(CIMCacheToolkit.KEY_ACCOUNT); + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualStoped = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + if( isManualStoped || account==null || account.trim().length()==0 || isManualDestory ) + { + return false; + } + + sendBindRequest(context,account); + + return true; + } + + + + /** + * 发送一个CIM请求 + * @param context + * @body + */ + public static void sendRequest(Context context, SentBody body){ + + boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + + if(isManualStop || isManualDestory) + { + return ; + } + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.putExtra(KEY_SEND_BODY, body); + serviceIntent.setAction(ACTION_SEND_REQUEST_BODY); + context.startService(serviceIntent); + + } + + /** + * 停止接受推送,将会退出当前账号登录,端口与服务端的连接 + * @param context + */ + public static void stop(Context context){ + + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory){ + return ; + } + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, true); + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION); + context.startService(serviceIntent); + + } + + + /** + * 完全销毁CIM,一般用于完全退出程序,调用resume将不能恢复 + * @param context + */ + public static void destroy(Context context){ + + + CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, true); + CIMCacheToolkit.getInstance(context).remove(CIMCacheToolkit.KEY_ACCOUNT); + + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.setAction(ACTION_DESTORY); + context.startService(serviceIntent); + + } + + + /** + * 重新恢复接收推送,重新连接服务端,并登录当前账号如果aotuBind == true + * @param context + * @param aotuBind + */ + public static void resume(Context context){ + + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory){ + return ; + } + + autoBindAccount(context); + } + + public static boolean isConnected(Context context){ + return CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE); + } + + public static int getState(Context context){ + boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + if(isManualDestory){ + return STATE_DESTROYED; + } + + boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + if(isManualStop){ + return STATE_STOPED; + } + + return STATE_NORMAL; + } + + private static String getVersionName(Context context) { + String versionName = null; + try { + PackageInfo mPackageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + versionName = mPackageInfo.versionName; + } catch (NameNotFoundException e) { + } + return versionName; + } + +} \ No newline at end of file diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java new file mode 100644 index 0000000..82f0324 --- /dev/null +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java @@ -0,0 +1,105 @@ + /** + * probject:cim-android-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; + +import com.farsunset.cim.sdk.android.model.SentBody; + + +/** + * 与服务端连接服务 + * + */ + public class CIMPushService extends Service { + + protected final static int DEF_CIM_PORT = 28888; + CIMConnectorManager manager; + WakeLock wakeLock; + @Override + public void onCreate() + { + manager = CIMConnectorManager.getManager(this.getApplicationContext()); + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, CIMPushService.class.getName()); + } + + + @Override + public int onStartCommand(Intent intent,int flags, int startId) { + + if(intent==null) + { + return START_STICKY; + } + + String action = intent.getAction(); + + if(CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) + { + String host = CIMCacheToolkit.getInstance(this).getString(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); + int port =CIMCacheToolkit.getInstance(this).getInt(CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + manager.connect(host,port); + } + + if(CIMPushManager.ACTION_SEND_REQUEST_BODY.equals(action)) + { + manager.send((SentBody) intent.getSerializableExtra(CIMPushManager.KEY_SEND_BODY)); + } + + if(CIMPushManager.ACTION_CLOSE_CIM_CONNECTION.equals(action)) + { + manager.closeSession(); + } + + if(CIMPushManager.ACTION_DESTORY.equals(action)) + { + manager.destroy(); + this.stopSelf(); + android.os.Process.killProcess(android.os.Process.myPid()); + } + + if(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action) && !manager.isConnected()) + { + + String host = CIMCacheToolkit.getInstance(this).getString(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); + int port =CIMCacheToolkit.getInstance(this).getInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + manager.connect(host,port); + } + + try{ + if(!wakeLock.isHeld()) + { + this.wakeLock.acquire(); + } + }catch(Exception e){} + + return START_STICKY; + } + + + public void onDestroy() + { + super.onDestroy(); + if(wakeLock.isHeld()) + { + this.wakeLock.release(); + wakeLock = null; + } + } + + + @Override + public IBinder onBind(Intent arg0) { + return null; + } + +} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/constant/CIMConstant.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java similarity index 74% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/constant/CIMConstant.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java index c1e85ef..8846777 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/constant/CIMConstant.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.constant; +package com.farsunset.cim.sdk.android.constant; /** * 常量 @@ -16,6 +16,7 @@ public interface CIMConstant { public static byte MESSAGE_SEPARATE='\b'; + public static long RECONN_INTERVAL_TIME= 30 * 1000; public static int CIM_DEFAULT_MESSAGE_ORDER=1; @@ -37,13 +38,13 @@ public interface CIMConstant { } /** - * 服务端心跳请求命令 + * 服务端心跳请求命令 cmd_server_hb_request */ - public static final String CMD_HEARTBEAT_REQUEST="cmd_server_hb_request"; + public static final String CMD_HEARTBEAT_REQUEST="S_H_RQ"; /** - * 客户端心跳响应命令 + * 客户端心跳响应命令 cmd_client_hb_response */ - public static final String CMD_HEARTBEAT_RESPONSE ="cmd_client_hb_response"; + public static final String CMD_HEARTBEAT_RESPONSE ="C_H_RS"; public static class RequestKey{ diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/CIMSessionDisableException.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/CIMSessionDisableException.java similarity index 86% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/CIMSessionDisableException.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/CIMSessionDisableException.java index 831e66a..7fb83fe 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/CIMSessionDisableException.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/CIMSessionDisableException.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.exception; +package com.farsunset.cim.sdk.android.exception; public class CIMSessionDisableException extends Exception { diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/NetWorkDisableException.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetWorkDisableException.java similarity index 86% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/NetWorkDisableException.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetWorkDisableException.java index c5ed6ab..f35ed57 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/exception/NetWorkDisableException.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetWorkDisableException.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.exception; +package com.farsunset.cim.sdk.android.exception; public class NetWorkDisableException extends Exception { diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/WriteToClosedSessionException.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/WriteToClosedSessionException.java similarity index 88% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/WriteToClosedSessionException.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/WriteToClosedSessionException.java index 399723e..d01c683 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/exception/WriteToClosedSessionException.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/WriteToClosedSessionException.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.exception; +package com.farsunset.cim.sdk.android.exception; import java.io.Serializable; diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageDecoder.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java similarity index 62% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageDecoder.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java index 65583de..2e6924c 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageDecoder.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java @@ -1,4 +1,10 @@ -package com.farsunset.cim.client.filter; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android.filter; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -14,15 +20,13 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import android.util.Log; +import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; -import com.farsunset.cim.client.constant.CIMConstant; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; +import android.util.Log; /** * 客户端消息解码 - * @author 3979434@qq.com - * */ public class ClientMessageDecoder extends ObjectDecoder { @@ -83,16 +87,61 @@ public class ClientMessageDecoder extends ObjectDecoder { if (name.equals("message")) { Message body = new Message(); - body.setType(doc.getElementsByTagName("type").item(0).getTextContent()); - body.setContent(doc.getElementsByTagName("content").item(0).getTextContent()); - body.setFile(doc.getElementsByTagName("file").item(0).getTextContent()); - body.setFileType(doc.getElementsByTagName("fileType").item(0).getTextContent()); - body.setTitle(doc.getElementsByTagName("title").item(0).getTextContent()); - body.setSender(doc.getElementsByTagName("sender").item(0).getTextContent()); - body.setReceiver(doc.getElementsByTagName("receiver").item(0).getTextContent()); - body.setFormat(doc.getElementsByTagName("format").item(0).getTextContent()); - body.setMid(doc.getElementsByTagName("mid").item(0).getTextContent()); - body.setTimestamp(Long.valueOf(doc.getElementsByTagName("timestamp").item(0).getTextContent())); + NodeList nodeList = doc.getElementsByTagName("message").item(0).getChildNodes(); + int count = nodeList.getLength(); + for(int i = 0;i < count; i++){ + Node node = nodeList.item(i); + + if(node.getNodeName().equals("mid")) + { + body.setMid(node.getTextContent()); + } + + if(node.getNodeName().equals("type")) + { + body.setType(node.getTextContent()); + } + + if(node.getNodeName().equals("content")) + { + body.setContent(node.getTextContent()); + } + + if(node.getNodeName().equals("file")) + { + body.setFile(node.getTextContent()); + } + + if(node.getNodeName().equals("fileType")) + { + body.setFileType(node.getTextContent()); + } + + if(node.getNodeName().equals("title")) + { + body.setTitle(node.getTextContent()); + } + + if(node.getNodeName().equals("sender")) + { + body.setSender(node.getTextContent()); + } + + if(node.getNodeName().equals("receiver")) + { + body.setReceiver(node.getTextContent()); + } + + if(node.getNodeName().equals("format")) + { + body.setFormat(node.getTextContent()); + } + + if(node.getNodeName().equals("timestamp")) + { + body.setTimestamp(Long.valueOf(node.getTextContent())); + } + } return body; } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageEncoder.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java similarity index 76% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageEncoder.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java index 75cc455..820f174 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/filter/ClientMessageEncoder.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java @@ -1,17 +1,23 @@ -package com.farsunset.cim.client.filter; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.android.filter; +import com.farsunset.cim.sdk.android.constant.CIMConstant; + import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import android.util.Log; -import com.farsunset.cim.client.constant.CIMConstant; /** * 客户端消息发送前进行编码,可在此加密消息 - * @author 3979434@qq.com * */ public class ClientMessageEncoder extends MessageToByteEncoder { diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/Message.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java similarity index 69% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/Message.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java index 0ea72e5..ce19251 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/Message.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.model; +package com.farsunset.cim.sdk.android.model; import java.io.Serializable; /** @@ -137,28 +137,54 @@ public class Message implements Serializable { this.format = format; } - public String toString() - { - + public String toString() { + StringBuffer buffer = new StringBuffer(); buffer.append(""); buffer.append(""); buffer.append("").append(mid).append(""); - buffer.append("").append(type).append(""); - buffer.append("").append(this.getTitle()==null?"":this.getTitle()).append(""); - buffer.append(""); - buffer.append("").append(this.getFile()==null?"":this.getFile()).append(""); - buffer.append("").append(this.getFileType()==null?"":this.getFileType()).append(""); - buffer.append("").append(this.getSender()==null?"":this.getSender()).append(""); - buffer.append("").append(this.getReceiver()==null?"":this.getReceiver()).append(""); - buffer.append("").append(this.getFormat()==null?"":this.getFormat()).append(""); - buffer.append("").append(timestamp).append(""); + + if (isNotEmpty(type)) { + buffer.append("").append(type).append(""); + } + + if (isNotEmpty(title)) { + buffer.append("").append(title).append(""); + } + if (isNotEmpty(content)) { + buffer.append(""); + } + + if (isNotEmpty(file)) { + buffer.append("").append(file).append(""); + } + + if (isNotEmpty(fileType)) { + buffer.append("").append(fileType).append(""); + } + + if (isNotEmpty(sender)) { + buffer.append("").append(sender).append(""); + } + + if (isNotEmpty(receiver)) { + buffer.append("").append(receiver).append(""); + } + + if (isNotEmpty(format)) { + buffer.append("").append(format).append(""); + } + + if (timestamp > 0) { + buffer.append("").append(timestamp).append(""); + } + buffer.append(""); return buffer.toString(); } - public String toXmlString() - { - + + public String toXmlString() { + return toString(); } @@ -169,6 +195,10 @@ public class Message implements Serializable { public void setMid(String mid) { this.mid = mid; } - + + public boolean isNotEmpty(String txt) { + return txt != null && !txt.isEmpty(); + } + } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/ReplyBody.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java similarity index 97% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/ReplyBody.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java index 0bc938f..4497506 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/client/model/ReplyBody.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.model; +package com.farsunset.cim.sdk.android.model; import java.io.Serializable; import java.util.HashMap; diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/SentBody.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java similarity index 97% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/SentBody.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java index 38c444f..c0f1508 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/client/model/SentBody.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java @@ -4,7 +4,7 @@ * * @author 3979434@qq.com */ -package com.farsunset.cim.client.model; +package com.farsunset.cim.sdk.android.model; import java.io.Serializable; import java.util.HashMap; diff --git a/cim_for_netty/cim-server-sdk/.classpath b/cim_for_netty/cim-server-sdk/.classpath index 057a55b..dfa3f00 100644 --- a/cim_for_netty/cim-server-sdk/.classpath +++ b/cim_for_netty/cim-server-sdk/.classpath @@ -1,9 +1,12 @@ - - + + + + + diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/constant/CIMConstant.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/constant/CIMConstant.java similarity index 60% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/constant/CIMConstant.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/constant/CIMConstant.java index 8d1b3ad..067acbc 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/constant/CIMConstant.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/constant/CIMConstant.java @@ -1,12 +1,13 @@ - -package com.farsunset.cim.server.constant; - -import java.nio.charset.Charset; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.constant; /** * 常量 - * - * @author 3979434@qq.com */ public interface CIMConstant { @@ -27,67 +28,38 @@ public interface CIMConstant { } - //连接空闲时间 - public static final int IDLE_TIME = 60;//秒 - - public static final int PING_TIME_OUT = 30;//心跳响应 超时为30秒 - - - public static final Charset ENCODE_UTF8 = Charset.forName("UTF-8"); + public static String UTF8="UTF-8"; public static byte MESSAGE_SEPARATE='\b'; - public static byte FLEX_DATA_SEPARATE='\0'; + //flex客户端 安全策略验证时会收到\0 + public static byte FLEX_DATA_SEPARATE = '\0'; public static int CIM_DEFAULT_MESSAGE_ORDER=1; - public static final String SESSION_KEY ="account"; + public static final String SESSION_KEY ="account"; public static final String HEARTBEAT_KEY ="heartbeat"; - /** - * 服务端心跳请求命令 - */ - public static final String CMD_HEARTBEAT_REQUEST="cmd_server_hb_request"; - /** - * 客户端心跳响应命令 - */ - public static final String CMD_HEARTBEAT_RESPONSE ="cmd_client_hb_response"; - public static final String HEARTBEAT_PINGED ="HEARTBEAT_PINGED"; - /** * FLEX 客户端socket请求发的安全策略请求,需要特殊处理,返回安全验证报文 */ public static final String FLEX_POLICY_REQUEST =""; public static final String FLEX_POLICY_RESPONSE ="\0"; - - - /** - * 对应cim-server 中 spring-cim.xml > bean:mainIoHandler >handlers - * 为 服务端处理对应的handlers,应该继承与com.farsunset.cim.nio.handle.CIMRequestHandler - * @author xiajun - * + * 服务端心跳请求命令 cmd_server_hb_request */ - public static class RequestKey{ - - - - public static String CLIENT_BIND ="client_bind"; - - public static String CLIENT_HEARTBEAT="client_heartbeat"; - - public static String CLIENT_LOGOUT ="client_logout"; - - - public static String CLIENT_OFFLINE_MESSAGE ="client_get_offline_message"; - - - } + public static final String CMD_HEARTBEAT_REQUEST="S_H_RQ"; + /** + * 客户端心跳响应命令 cmd_client_hb_response + */ + public static final String CMD_HEARTBEAT_RESPONSE ="C_H_RS"; + + public static class SessionStatus{ @@ -97,11 +69,22 @@ public interface CIMConstant { } - public static class MessageType{ - //账号在其他设备绑定时,会收到该类型消息 + //用户会 踢出下线消息类型 public static String TYPE_999 ="999"; } + + public static class RequestKey{ + + public static String CLIENT_BIND ="client_bind"; + public static String CLIENT_HEARTBEAT="client_heartbeat"; + public static String CLIENT_FLASH_POLICY="client_flash_policy"; + public static String CLIENT_LOGOUT ="client_logout"; + public static String CLIENT_OFFLINE_MESSAGE ="client_get_offline_message"; + public static String KEY_CLIENT_CIMSESSION_CLOSED = "client_cimsession_closed"; + + } + } \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageDecoder.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageDecoder.java similarity index 76% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageDecoder.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageDecoder.java index a30b176..7c21086 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageDecoder.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageDecoder.java @@ -1,4 +1,10 @@ -package com.farsunset.cim.server.filter; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.filter; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -13,12 +19,10 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import com.farsunset.cim.server.constant.CIMConstant; -import com.farsunset.cim.server.mutual.SentBody; +import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.model.SentBody; /** * 服务端接收消息解码,可在此解密消息 - * @author 3979434@qq.com - * */ public class ServerMessageDecoder extends ObjectDecoder { protected final Logger logger = Logger.getLogger(ServerMessageDecoder.class.getSimpleName()); @@ -40,11 +44,11 @@ public class ServerMessageDecoder extends ObjectDecoder { byte[] data = new byte[length-1]; buffer.readBytes(data); - String message = new String(new String(data,CIMConstant.ENCODE_UTF8)); + String message = new String(new String(data,CIMConstant.UTF8)); logger.debug(message); buffer.readByte(); - SentBody body = parserMessageToSentBody(message); + Object body = parserMessageToSentBody(message); data = null; message = null; return body; @@ -58,30 +62,40 @@ public class ServerMessageDecoder extends ObjectDecoder { byte[] data = new byte[length-1]; buffer.readBytes(data); - String message = new String(new String(data,CIMConstant.ENCODE_UTF8)); - System.out.println("[ServerMessageDecoder]:"+message); - + String message = new String(new String(data,CIMConstant.UTF8)); //将末尾的消息分隔符读取掉 buffer.readByte(); data = null; + + + /** + * flex 客户端安全策略请求,需要返回特定报文 + */ + if(CIMConstant.FLEX_POLICY_REQUEST.equals(message)) + { + SentBody body = new SentBody(); + body.setKey(CIMConstant.RequestKey.CLIENT_FLASH_POLICY); + return body; + } + return message; } return null; } - private SentBody parserMessageToSentBody(String message) throws Exception + private Object parserMessageToSentBody(String message) throws Exception { + SentBody body = new SentBody(); if(message.equals(CIMConstant.CMD_HEARTBEAT_RESPONSE))//如果是心跳响应,则让HeartbeatHandler去处理 { body.setKey(CIMConstant.RequestKey.CLIENT_HEARTBEAT); return body; } - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.parse(new ByteArrayInputStream(message.toString().getBytes(CIMConstant.ENCODE_UTF8))); + Document doc = builder.parse(new ByteArrayInputStream(message.toString().getBytes(CIMConstant.UTF8))); body.setKey(doc.getElementsByTagName("key").item(0).getTextContent()); NodeList dataNodeList = doc.getElementsByTagName("data"); if(dataNodeList!=null && dataNodeList.getLength()>0) diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageEncoder.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageEncoder.java similarity index 70% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageEncoder.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageEncoder.java index 2f70f26..70e4208 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/filter/ServerMessageEncoder.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/filter/ServerMessageEncoder.java @@ -1,7 +1,10 @@ -package com.farsunset.cim.server.filter; - - - +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.filter; import org.apache.log4j.Logger; import io.netty.buffer.ByteBuf; @@ -9,19 +12,17 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; -import com.farsunset.cim.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.constant.CIMConstant; /** * 服务端发送消息前编码,可在此加密消息 - * @author 3979434@qq.com - * */ public class ServerMessageEncoder extends MessageToByteEncoder { protected final Logger logger = Logger.getLogger(ServerMessageEncoder.class.getSimpleName()); @Override protected void encode(ChannelHandlerContext ctx, Object message, ByteBuf out) throws Exception { - out.writeBytes(message.toString().getBytes(CIMConstant.ENCODE_UTF8)); + out.writeBytes(message.toString().getBytes(CIMConstant.UTF8)); out.writeByte(CIMConstant.MESSAGE_SEPARATE); logger.debug(message); } diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java new file mode 100644 index 0000000..4dbcdd9 --- /dev/null +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/CIMRequestHandler.java @@ -0,0 +1,20 @@ +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.handler; + +/** + * 请求处理接口,所有的请求实现必须实现此接口 + * @author 3979434@qq.com + */ +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.sdk.server.session.CIMSession; + +public interface CIMRequestHandler { + + public abstract ReplyBody process(CIMSession session,SentBody message); +} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/FlashPolicyHandler.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/FlashPolicyHandler.java new file mode 100644 index 0000000..42bdd40 --- /dev/null +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/FlashPolicyHandler.java @@ -0,0 +1,31 @@ + /** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.handler; + +import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.sdk.server.session.CIMSession; + + +/** + *返回flash安全验证 + * + * @author + */ +public class FlashPolicyHandler implements CIMRequestHandler { + + + public ReplyBody process(CIMSession session, SentBody message) { + + session.write(CIMConstant.FLEX_POLICY_RESPONSE); + return null; + } + + + +} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/HeartbeatHandler.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/HeartbeatHandler.java new file mode 100644 index 0000000..eec00fe --- /dev/null +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/handler/HeartbeatHandler.java @@ -0,0 +1,32 @@ + /** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.handler; + +import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.sdk.server.session.CIMSession; + + +/** + *客户端心跳实现 + * + * @author + */ +public class HeartbeatHandler implements CIMRequestHandler { + + + public ReplyBody process(CIMSession session, SentBody message) { + + //收到心跳响应,清除发送心跳请求标记 + session.removeAttribute(CIMConstant.RequestKey.CLIENT_HEARTBEAT); + return null; + } + + + +} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/launcher/CIMNioSocketAcceptor.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/launcher/CIMNioSocketAcceptor.java similarity index 58% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/launcher/CIMNioSocketAcceptor.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/launcher/CIMNioSocketAcceptor.java index 79b6637..bdf35a8 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/launcher/CIMNioSocketAcceptor.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/launcher/CIMNioSocketAcceptor.java @@ -1,7 +1,9 @@ -package com.farsunset.cim.launcher; +package com.farsunset.cim.sdk.server.launcher; import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.SimpleChannelInboundHandler; @@ -18,24 +20,30 @@ import java.util.HashMap; import org.apache.log4j.Logger; -import com.farsunset.cim.server.constant.CIMConstant; -import com.farsunset.cim.server.filter.ServerMessageDecoder; -import com.farsunset.cim.server.filter.ServerMessageEncoder; -import com.farsunset.cim.server.handler.CIMRequestHandler; -import com.farsunset.cim.server.mutual.ReplyBody; -import com.farsunset.cim.server.mutual.SentBody; -import com.farsunset.cim.server.session.CIMSession; +import com.farsunset.cim.sdk.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.filter.ServerMessageDecoder; +import com.farsunset.cim.sdk.server.filter.ServerMessageEncoder; +import com.farsunset.cim.sdk.server.handler.CIMRequestHandler; +import com.farsunset.cim.sdk.server.model.ReplyBody; +import com.farsunset.cim.sdk.server.model.SentBody; +import com.farsunset.cim.sdk.server.session.CIMSession; @io.netty.channel.ChannelHandler.Sharable -public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler{ +public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler{ protected final Logger logger = Logger.getLogger(CIMNioSocketAcceptor.class.getSimpleName()); - public final static String KEY_CLIENT_CIMSESSION_CLOSED = "client_cimsession_closed"; private HashMap handlers = new HashMap(); private int port; + //连接空闲时间 + public static final int READ_IDLE_TIME = 180;//秒 - + //连接空闲时间 + public static final int WRITE_IDLE_TIME = 150;//秒 + + public static final int PING_TIME_OUT = 30;//心跳响应 超时为30秒 + + public static final String HEARTBEAT_PINGED ="HEARTBEAT_PINGED"; public void bind() { @@ -47,6 +55,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler{ try{ ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup); + bootstrap.childOption(ChannelOption.TCP_NODELAY, true); bootstrap.channel(NioServerSocketChannel.class); bootstrap.childHandler(new ChannelInitializer() { @Override @@ -55,7 +64,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler{ pipeline.addLast(new ServerMessageDecoder(ClassResolvers.cacheDisabled(null))); pipeline.addLast(new ServerMessageEncoder()); - pipeline.addLast(new IdleStateHandler(CIMConstant.IDLE_TIME/2,0,CIMConstant.IDLE_TIME)); + pipeline.addLast(new IdleStateHandler(READ_IDLE_TIME,WRITE_IDLE_TIME,0)); pipeline.addLast(CIMNioSocketAcceptor.this); } }); @@ -76,49 +85,64 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler{ @Override public void channelRegistered( ChannelHandlerContext ctx) throws Exception { - logger.debug("channelRegistered()... from "+ctx.channel().remoteAddress()); } + /** + */ + public void exceptionCaught( ChannelHandlerContext ctx, Throwable cause) + throws Exception { + logger.error("exceptionCaught()... from "+ctx.channel().remoteAddress()); + ctx.channel().close(); + CIMRequestHandler handler = handlers.get(CIMConstant.RequestKey.KEY_CLIENT_CIMSESSION_CLOSED); + handler.process(new CIMSession(ctx.channel()), null); + } + /** * 检测到连接空闲事件,发送心跳请求命令 */ @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state().equals(IdleState.ALL_IDLE)) { - ctx.channel().attr(AttributeKey.valueOf(CIMConstant.HEARTBEAT_PINGED)).set(System.currentTimeMillis()); - ctx.channel().writeAndFlush(CIMConstant.CMD_HEARTBEAT_REQUEST); + + if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state().equals(IdleState.WRITER_IDLE)) { + onWriterIdeled(ctx.channel()); } //如果心跳请求发出30秒内没收到响应,则关闭连接 - if (evt instanceof IdleStateEvent - && ((IdleStateEvent) evt).state().equals(IdleState.READER_IDLE) - && ctx.channel().attr(AttributeKey.valueOf(CIMConstant.HEARTBEAT_PINGED)).get()!=null) + if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state().equals(IdleState.READER_IDLE)) { - long t = (Long) ctx.channel().attr(AttributeKey.valueOf(CIMConstant.HEARTBEAT_PINGED)).get(); - if(System.currentTimeMillis() - t >= CIMConstant.PING_TIME_OUT) - { - ctx.channel().close(); - } + onReaderIdeled(ctx.channel()); } super.userEventTriggered(ctx, evt); } + + + private void onWriterIdeled(Channel channel){ + channel.attr(AttributeKey.valueOf(HEARTBEAT_PINGED)).set(System.currentTimeMillis()); + channel.writeAndFlush(CIMConstant.CMD_HEARTBEAT_REQUEST); + } - protected void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception { + private void onReaderIdeled(Channel channel){ + Long lastTime = (Long) channel.attr(AttributeKey.valueOf(HEARTBEAT_PINGED)).get(); + if(lastTime == null || System.currentTimeMillis() - lastTime >= PING_TIME_OUT) + { + channel.close(); + CIMRequestHandler handler = handlers.get(CIMConstant.RequestKey.KEY_CLIENT_CIMSESSION_CLOSED); + handler.process(new CIMSession(channel), null); + } + + channel.attr(AttributeKey.valueOf(HEARTBEAT_PINGED)).set(null); + } + + + protected void channelRead0(ChannelHandlerContext ctx, SentBody body) throws Exception { - /** - * flex 客户端安全策略请求,需要返回特定报文 - */ - if(CIMConstant.FLEX_POLICY_REQUEST.equals(msg)) - { - ctx.writeAndFlush(CIMConstant.FLEX_POLICY_RESPONSE); - return ; - } + + CIMSession cimSession =new CIMSession(ctx.channel()); ReplyBody reply = new ReplyBody(); - SentBody body = (SentBody)msg; String key = body.getKey(); CIMRequestHandler handler = handlers.get(key); @@ -139,20 +163,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler{ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - - CIMSession cimSession =new CIMSession(ctx.channel()); - try{ - logger.debug("channelInactive()... from "+cimSession.getRemoteAddress()); - CIMRequestHandler handler = handlers.get(KEY_CLIENT_CIMSESSION_CLOSED); - if(handler!=null && cimSession.hasTag(CIMConstant.SESSION_KEY)) - { - handler.process(cimSession, null); - } - } - catch(Exception e) - { - e.printStackTrace(); - } + logger.debug("channelInactive-----------"+ctx.channel().remoteAddress()); } diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/Message.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/Message.java similarity index 66% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/Message.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/Message.java index 876a7e3..166b73a 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/Message.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/Message.java @@ -1,17 +1,17 @@ -package com.farsunset.cim.server.mutual; +/** + * probject:cim-server-sdk + * @version 2.0.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.model; import java.io.Serializable; /** * 消息对象 - * @author @author 3979434@qq.com - * */ public class Message implements Serializable { - /** - * @author 3979434@qq.com - * 消息对象 - */ private static final long serialVersionUID = 1L; @@ -137,28 +137,54 @@ public class Message implements Serializable { this.format = format; } - public String toString() - { - + public String toString() { + StringBuffer buffer = new StringBuffer(); buffer.append(""); buffer.append(""); buffer.append("").append(mid).append(""); - buffer.append("").append(type).append(""); - buffer.append("").append(this.getTitle()==null?"":this.getTitle()).append(""); - buffer.append(""); - buffer.append("").append(this.getFile()==null?"":this.getFile()).append(""); - buffer.append("").append(this.getFileType()==null?"":this.getFileType()).append(""); - buffer.append("").append(this.getSender()==null?"":this.getSender()).append(""); - buffer.append("").append(this.getReceiver()==null?"":this.getReceiver()).append(""); - buffer.append("").append(this.getFormat()==null?"":this.getFormat()).append(""); - buffer.append("").append(String.valueOf(timestamp)).append(""); + + if (isNotEmpty(type)) { + buffer.append("").append(type).append(""); + } + + if (isNotEmpty(title)) { + buffer.append("").append(title).append(""); + } + if (isNotEmpty(content)) { + buffer.append(""); + } + + if (isNotEmpty(file)) { + buffer.append("").append(file).append(""); + } + + if (isNotEmpty(fileType)) { + buffer.append("").append(fileType).append(""); + } + + if (isNotEmpty(sender)) { + buffer.append("").append(sender).append(""); + } + + if (isNotEmpty(receiver)) { + buffer.append("").append(receiver).append(""); + } + + if (isNotEmpty(format)) { + buffer.append("").append(format).append(""); + } + + if (timestamp > 0) { + buffer.append("").append(timestamp).append(""); + } + buffer.append(""); return buffer.toString(); } - public String toXmlString() - { - + + public String toXmlString() { + return toString(); } @@ -169,6 +195,10 @@ public class Message implements Serializable { public void setMid(String mid) { this.mid = mid; } - + + public boolean isNotEmpty(String txt) { + return txt != null && !txt.isEmpty(); + } + } diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/ReplyBody.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/ReplyBody.java similarity index 90% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/ReplyBody.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/ReplyBody.java index 4a4816b..050d57c 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/ReplyBody.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/ReplyBody.java @@ -1,18 +1,19 @@ -package com.farsunset.cim.server.mutual; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.model; import java.io.Serializable; import java.util.HashMap; /** * 请求应答对象 - * @author 3979434@qq.com * */ public class ReplyBody implements Serializable { - - /** - * @author 3979434@qq.com - * 服务端返回消息对象 - */ + private static final long serialVersionUID = 1L; /** @@ -97,11 +98,12 @@ public class ReplyBody implements Serializable { public String toString() { + StringBuffer buffer = new StringBuffer(); buffer.append(""); buffer.append(""); buffer.append("").append(this.getKey()).append(""); - buffer.append("").append(String.valueOf(timestamp)).append(""); + buffer.append("").append(timestamp).append(""); buffer.append("").append(code).append(""); buffer.append(""); for(String key:this.getData().keySet()) diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/SentBody.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/SentBody.java similarity index 86% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/SentBody.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/SentBody.java index 9b197da..cd5d2d1 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/mutual/SentBody.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/model/SentBody.java @@ -1,17 +1,19 @@ -package com.farsunset.cim.server.mutual; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.model; import java.io.Serializable; import java.util.HashMap; /** * java |android 客户端请求结构 - * @author 3979434@qq.com * */ public class SentBody implements Serializable { - /** - * @author 3979434@qq.com 客户端发送消息对象 - */ private static final long serialVersionUID = 1L; private String key; @@ -64,7 +66,7 @@ public class SentBody implements Serializable { buffer.append(""); buffer.append(""); buffer.append("").append(key).append(""); - buffer.append("").append(String.valueOf(timestamp)).append(""); + buffer.append("").append(timestamp).append(""); buffer.append(""); for (String key : data.keySet()) { buffer.append("<" + key + ">").append(data.get(key)).append( diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/CIMSession.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/CIMSession.java new file mode 100644 index 0000000..b3564b4 --- /dev/null +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/CIMSession.java @@ -0,0 +1,395 @@ +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.session; + +import io.netty.channel.Channel; +import io.netty.util.AttributeKey; + +import java.io.Serializable; +import java.net.InetAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; + + +import com.farsunset.cim.sdk.server.constant.CIMConstant; + +/** + * Channel包装类,集群时 将此对象存入表中 + */ + +public class CIMSession implements Serializable{ + + /** + * + */ + private transient static final long serialVersionUID = 1L; + public transient static String ID = "ID"; + public transient static String HOST = "HOST"; + public transient static final int STATUS_ENABLED = 0; + public transient static final int STATUS_DISABLED = 1; + public transient static final int APNS_ON=1; + public transient static final int APNS_OFF=0; + + public transient static String CHANNEL_IOS = "ios"; + public transient static String CHANNEL_ANDROID = "android"; + public transient static String CHANNEL_WINDOWS = "windows"; + public transient static String CHANNEL_WP = "wp"; + + private transient Channel session; + + private String gid;//session全局ID + private String nid;//session在本台服务器上的ID + private String deviceId;//客户端ID (设备号码+应用包名),ios为devicetoken + private String host;//session绑定的服务器IP + private String account;//session绑定的账号 + private String channel;//终端设备类型 + private String deviceModel;//终端设备型号 + private String clientVersion;//终端应用版本 + private String systemVersion;//终端系统版本 + private String packageName;//终端应用包名 + private Long bindTime;//登录时间 + private Long heartbeat;//心跳时间 + private Double longitude;//经度 + private Double latitude;//维度 + private String location;//位置 + private int apnsAble;//apns推送状态 + private int status;// 状态 + public CIMSession(Channel session) { + this.session = session; + this.nid = session.id().asLongText(); + } + + public CIMSession() + { + + } + + + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + + setAttribute(CIMConstant.SESSION_KEY, account); + } + + + + + + + public Double getLongitude() { + return longitude; + } + + public void setLongitude(Double longitude) { + setAttribute("longitude", longitude); + this.longitude = longitude; + } + + public Double getLatitude() { + return latitude; + } + + public void setLatitude(Double latitude) { + setAttribute("latitude", latitude); + this.latitude = latitude; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + setAttribute("location", location); + this.location = location; + } + + public String getGid() { + return gid; + } + + public void setGid(String gid) { + + this.gid = gid; + + setAttribute("gid", gid); + } + + public String getNid() { + return nid; + } + + public void setNid(String nid) { + this.nid = nid; + } + + public String getDeviceId() { + return deviceId; + } + + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + + setAttribute("channel", channel); + } + + public String getDeviceModel() { + return deviceModel; + } + + public void setDeviceModel(String deviceModel) { + this.deviceModel = deviceModel; + + setAttribute("deviceModel", deviceModel); + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + + setAttribute("deviceId", deviceId); + } + + + + + public String getHost() { + return host; + } + + + + public Long getBindTime() { + return bindTime; + } + + public void setBindTime(Long bindTime) { + this.bindTime = bindTime; + setAttribute("bindTime", bindTime); + } + + + public String getClientVersion() { + return clientVersion; + } + + public void setClientVersion(String clientVersion) { + this.clientVersion = clientVersion; + setAttribute("clientVersion", clientVersion); + } + + + + + + public String getSystemVersion() { + return systemVersion; + } + + public void setSystemVersion(String systemVersion) { + this.systemVersion = systemVersion; + setAttribute("systemVersion", systemVersion); + } + + public Long getHeartbeat() { + return heartbeat; + } + + public void setHeartbeat(Long heartbeat) { + this.heartbeat = heartbeat; + setAttribute(CIMConstant.HEARTBEAT_KEY, heartbeat); + } + + public void setHost(String host) { + this.host = host; + + setAttribute("host", host); + } + + + + + public int getApnsAble() { + return apnsAble; + } + + public void setApnsAble(int apnsAble) { + this.apnsAble = apnsAble; + setAttribute("apnsAble", apnsAble); + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + setAttribute("status", status); + } + + + public void setAttribute(String key, Object value) { + if(session!=null) + session.attr(AttributeKey.valueOf(key)).set(value); + } + + + public boolean containsAttribute(String key) { + if(session!=null) + return session.hasAttr(AttributeKey.valueOf(key)); + return false; + } + + public Object getAttribute(String key) { + if(session!=null) + return session.attr(AttributeKey.valueOf(key)).get(); + return null; + } + + public void removeAttribute(String key) { + if(session!=null) + session.attr(AttributeKey.valueOf(key)).remove(); + } + + public SocketAddress getRemoteAddress() { + if(session!=null) + return session.remoteAddress(); + return null; + } + + public boolean write(Object msg) { + if(session!=null) + { + return session.writeAndFlush(msg).awaitUninterruptibly(5000); + } + + return false; + } + + public boolean isConnected() { + if(session != null && isLocalhost()) + { + return session.isActive(); + } + + if(!isLocalhost()) + { + return status == STATUS_ENABLED; + } + + return false; + } + + public boolean isLocalhost() + { + + try { + String ip = InetAddress.getLocalHost().getHostAddress(); + return ip.equals(host); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return false; + + } + + + public void closeNow() { + closeOnFlush(); + } + + public void closeOnFlush() { + if(session!=null){ + session.disconnect(); + session.close(); + } + + } + + + public void setPackageName(String packageName) { + this.packageName = packageName; + setAttribute("packageName", apnsAble); + } + + public String getPackageName() { + return packageName; + } + public boolean equals(Object o) { + + if (o instanceof CIMSession) { + + CIMSession t = (CIMSession) o; + if(t.deviceId!=null && deviceId!=null) + { + return t.deviceId.equals(deviceId) && t.nid == nid && t.host.equals(host); + } + } + return false; + } + + public boolean fromOtherDevice(Object o) { + + if (o instanceof CIMSession) { + + CIMSession t = (CIMSession) o; + if(t.deviceId!=null && deviceId!=null) + { + return !t.deviceId.equals(deviceId); + } + } + return false; + } + + public boolean fromCurrentDevice(Object o) { + + return !fromOtherDevice(o); + } + + public void setChannel(Channel session) { + this.session = session; + } + + public Channel getSession() { + return session; + } + + + + public String toString() + { + StringBuffer buffer = new StringBuffer(); + buffer.append("{"); + + buffer.append("\"").append("gid").append("\":").append("\"").append(gid).append("\"").append(","); + buffer.append("\"").append("nid").append("\":").append(nid).append(","); + buffer.append("\"").append("deviceId").append("\":").append("\"").append(deviceId).append("\"").append(","); + buffer.append("\"").append("host").append("\":").append("\"").append(host).append("\"").append(","); + buffer.append("\"").append("account").append("\":").append("\"").append(account).append("\"").append(","); + buffer.append("\"").append("channel").append("\":").append("\"").append(channel).append("\"").append(","); + buffer.append("\"").append("deviceModel").append("\":").append("\"").append(deviceModel).append("\"").append(","); + buffer.append("\"").append("status").append("\":").append(status).append(","); + buffer.append("\"").append("apnsAble").append("\":").append(apnsAble).append(","); + buffer.append("\"").append("bindTime").append("\":").append(bindTime).append(","); + buffer.append("\"").append("heartbeat").append("\":").append(heartbeat); + buffer.append("}"); + return buffer.toString(); + + } + + + +} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/DefaultSessionManager.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/DefaultSessionManager.java similarity index 51% rename from cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/DefaultSessionManager.java rename to cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/DefaultSessionManager.java index 8a38c63..335d585 100644 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/DefaultSessionManager.java +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/DefaultSessionManager.java @@ -1,16 +1,20 @@ - -package com.farsunset.cim.server.session; - -import java.util.Collection; +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.session; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import com.farsunset.cim.server.constant.CIMConstant; +import com.farsunset.cim.sdk.server.constant.CIMConstant; /** * 自带默认 session管理实现, 各位可以自行实现 AbstractSessionManager接口来实现自己的 session管理 *服务器集群时 须要将CIMSession 信息存入数据库或者nosql 等 第三方存储空间中,便于所有服务器都可以访问 - * @author farsunset (3979434@qq.com) */ public class DefaultSessionManager implements SessionManager{ @@ -25,10 +29,10 @@ public class DefaultSessionManager implements SessionManager{ /** * */ - public void addSession(String account,CIMSession session) { + public void add(String account,CIMSession session) { if(session!=null) { - session.setTag(CIMConstant.SESSION_KEY, account); + session.setAttribute(CIMConstant.SESSION_KEY, account); sessions.put(account, session); connectionsCounter.incrementAndGet(); } @@ -36,7 +40,7 @@ public class DefaultSessionManager implements SessionManager{ } - public CIMSession getSession(String account) { + public CIMSession get(String account) { return sessions.get(account); @@ -45,47 +49,62 @@ public class DefaultSessionManager implements SessionManager{ - public Collection getSessions() { - return sessions.values(); + public List queryAll() { + List list = new ArrayList(); + list.addAll(sessions.values()); + return list; } - public void removeSession(CIMSession session) { + public void remove(CIMSession session) { - sessions.remove(session.getTag(CIMConstant.SESSION_KEY)); + sessions.remove(session.getAttribute(CIMConstant.SESSION_KEY)); } - public void removeSession(String account) { + public void remove(String account) { sessions.remove(account); } - public boolean containsCIMSession(CIMSession ios) + public boolean containsCIMSession(String account) { - return sessions.containsKey(ios.getTag(CIMConstant.SESSION_KEY)) || sessions.containsValue(ios); + return sessions.containsKey(account); } public String getAccount(CIMSession ios) { - if(ios.getTag(CIMConstant.SESSION_KEY)==null) + if(ios.getAttribute(CIMConstant.SESSION_KEY)==null) { for(String key:sessions.keySet()) { - if(sessions.get(key).equals(ios) || sessions.get(key).getNid()==ios.getNid()) + if(sessions.get(key).equals(ios) || sessions.get(key).getGid()==ios.getGid()) { return key; } } }else { - return ios.getTag(CIMConstant.SESSION_KEY).toString(); + return ios.getAttribute(CIMConstant.SESSION_KEY).toString(); } return null; } + + + @Override + public void update(CIMSession session) { + sessions.put(session.getAccount(), session); + } + + + @Override + public void setState(String account,int state) { + sessions.get(account).setStatus(state); + } + } diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/SessionManager.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/SessionManager.java new file mode 100644 index 0000000..a46e32b --- /dev/null +++ b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/sdk/server/session/SessionManager.java @@ -0,0 +1,55 @@ +/** + * probject:cim-server-sdk + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.cim.sdk.server.session; + +import java.util.List; + + +/** + * 客户端的 session管理接口 + * 可自行实现此接口管理session + */ + +public interface SessionManager { + + + /** + * 添加新的session + */ + public void add(String account,CIMSession session); + + /** + * 更新session + */ + public void update(CIMSession session); + + /** + * + * @param account 客户端session的 key 一般可用 用户账号来对应session + * @return + */ + CIMSession get(String account); + + /** + * 获取所有session + * @return + */ + public List queryAll(); + + + /** + * 删除session + * @param session + */ + public void remove(String account); + + /** + * 设置session失效 + * @param session + */ + public void setState(String account,int state); +} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMRequestHandler.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMRequestHandler.java deleted file mode 100644 index 99e07a8..0000000 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/handler/CIMRequestHandler.java +++ /dev/null @@ -1,15 +0,0 @@ - -package com.farsunset.cim.server.handler; - -/** - * 请求处理接口,所有的请求实现必须实现此接口 - * @author 3979434@qq.com - */ -import com.farsunset.cim.server.mutual.ReplyBody; -import com.farsunset.cim.server.mutual.SentBody; -import com.farsunset.cim.server.session.CIMSession; - -public interface CIMRequestHandler { - - public abstract ReplyBody process(CIMSession session,SentBody message); -} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/handler/HeartbeatHandler.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/handler/HeartbeatHandler.java deleted file mode 100644 index 405c328..0000000 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/handler/HeartbeatHandler.java +++ /dev/null @@ -1,26 +0,0 @@ - -package com.farsunset.cim.server.handler; - -import com.farsunset.cim.server.constant.CIMConstant; -import com.farsunset.cim.server.mutual.ReplyBody; -import com.farsunset.cim.server.mutual.SentBody; -import com.farsunset.cim.server.session.CIMSession; - -/** - *客户端心跳实现 - * - * @author - */ -public class HeartbeatHandler implements CIMRequestHandler { - - - public ReplyBody process(CIMSession session, SentBody message) { - - //收到心跳响应,清除发送心跳请求标记 - session.removeTag(CIMConstant.HEARTBEAT_PINGED); - return null; - } - - - -} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/CIMSession.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/CIMSession.java deleted file mode 100644 index c3f6155..0000000 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/CIMSession.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.farsunset.cim.server.session; - -import io.netty.channel.Channel; -import io.netty.util.AttributeKey; - -import java.io.Serializable; -import java.net.InetAddress; -import java.net.SocketAddress; -import java.net.UnknownHostException; - -import com.farsunset.cim.server.constant.CIMConstant; - -/** - * IoSession包装类,集群时 将此对象存入表中 - * - * @author 3979434@qq.com - */ - -public class CIMSession implements Serializable{ - - /** - * - */ - private static final long serialVersionUID = 1L; - public static String ID = "ID"; - public static String HOST = "HOST"; - - private Channel session; - - private String gid;//session全局ID - private String nid;//session在本台服务器上的ID - private String deviceId;//客户端设备ID - private String host;//session绑定的服务器IP - private String account;//session绑定的账号 - private String channel;//终端设备类型 - private String deviceModel;//终端设备型号 - private String appVersion;//客户端应用版本 - private Long bindTime;//登录时间 - - private Long heartbeat;//心跳时间 - - public CIMSession(Channel session) { - this.session = session; - this.nid = session.id().asLongText(); - } - - - - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - if(session!=null) - { - setTag(CIMConstant.SESSION_KEY, account); - } - this.account = account; - } - - - public void setTag(String key,Object value) - { - if(value!=null) - session.attr(AttributeKey.valueOf(key)).set(value.toString()); - } - - - public String getTag(String key) - { - Object tag = session.attr(AttributeKey.valueOf(key)).get(); - return tag!=null?tag.toString():null; - } - - - public String getGid() { - return gid; - } - - public void setGid(String gid) { - this.gid = gid; - } - - public String getNid() { - return nid; - } - - public void setNid(String nid) { - this.nid = nid; - } - - public String getDeviceId() { - return deviceId; - } - - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getDeviceModel() { - return deviceModel; - } - - public void setDeviceModel(String deviceModel) { - this.deviceModel = deviceModel; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - - - - public String getHost() { - return host; - } - - - - public Long getBindTime() { - return bindTime; - } - - public void setBindTime(Long bindTime) { - this.bindTime = bindTime; - } - - public Long getHeartbeat() { - return heartbeat; - } - - public void setHeartbeat(Long heartbeat) { - this.heartbeat = heartbeat; - if(session!=null ) - { - setTag(CIMConstant.HEARTBEAT_KEY, heartbeat.toString()); - } - } - - public void setHost(String host) { - this.host = host; - } - - - - - - public String getAppVersion() { - return appVersion; - } - - - - - public void setAppVersion(String appVersion) { - this.appVersion = appVersion; - } - - - - - public boolean hasTag(String key) { - if(session!=null) - return session.hasAttr(AttributeKey.valueOf(key)); - return false; - } - - - public void removeTag(String key) { - session.attr(AttributeKey.valueOf(key)).remove(); - } - - public SocketAddress getRemoteAddress() { - if(session!=null) - return session.remoteAddress(); - return null; - } - - public boolean write(Object msg) { - if(session!=null && session.isActive()) - { - - return session.writeAndFlush(msg).awaitUninterruptibly(5000); - } - return false; - } - - public boolean isConnected() { - if(session!=null) - return session.isActive(); - return false; - } - - public boolean isLocalhost() - { - - try { - String ip = InetAddress.getLocalHost().getHostAddress(); - return ip.equals(host) && session!=null; - } catch (UnknownHostException e) { - e.printStackTrace(); - } - return false; - - } - - - public void close(boolean immediately) { - if(session!=null) - { - session.disconnect(); - session.close(); - } - } - - - public boolean equals(Object o) { - - if (o instanceof CIMSession) { - - CIMSession t = (CIMSession) o; - if(!t.isLocalhost()) - { - return false; - } - if (t.session.id().asLongText().equals(session.id().asLongText())&& t.host.equals(host)) { - return true; - } - return false; - } else { - return false; - } - - } - - public Channel getSession() { - return session; - } - - public void setSession(Channel session) { - this.session = session; - } - - - - - - - -} \ No newline at end of file diff --git a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/SessionManager.java b/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/SessionManager.java deleted file mode 100644 index 1f6edb4..0000000 --- a/cim_for_netty/cim-server-sdk/src/com/farsunset/cim/server/session/SessionManager.java +++ /dev/null @@ -1,58 +0,0 @@ - -package com.farsunset.cim.server.session; - -import java.util.Collection; - - -/** - * 客户端的 session管理接口 - * 可自行实现此接口管理session - * @author 3979434@qq.com - */ - -public interface SessionManager { - - - /** - * 添加新的session - */ - public void addSession(String account,CIMSession session); - - /** - * - * @param account 客户端session的 key 一般可用 用户账号来对应session - * @return - */ - CIMSession getSession(String account); - - /** - * 获取所有session - * @return - */ - public Collection getSessions(); - - /** - * 删除session - * @param session - */ - public void removeSession(CIMSession session) ; - - - /** - * 删除session - * @param session - */ - public void removeSession(String account); - - /** - * session是否存在 - * @param session - */ - public boolean containsCIMSession(CIMSession ios); - - /** - * session获取对应的 用户 key - * @param session - */ - public String getAccount(CIMSession ios); -} \ No newline at end of file diff --git a/cim_for_netty/cim-server/.classpath b/cim_for_netty/cim-server/.classpath index 8bf2c44..116b57d 100644 --- a/cim_for_netty/cim-server/.classpath +++ b/cim_for_netty/cim-server/.classpath @@ -22,7 +22,6 @@ - @@ -30,7 +29,6 @@ - @@ -38,5 +36,15 @@ + + + + + + + + + + diff --git a/cim_for_netty/cim-server/.settings/org.eclipse.core.resources.prefs b/cim_for_netty/cim-server/.settings/org.eclipse.core.resources.prefs index bb86404..be1ca8f 100644 --- a/cim_for_netty/cim-server/.settings/org.eclipse.core.resources.prefs +++ b/cim_for_netty/cim-server/.settings/org.eclipse.core.resources.prefs @@ -1,4 +1,5 @@ -#Mon Sep 15 18:21:03 CST 2014 +#Mon Sep 15 17:02:27 CST 2014 eclipse.preferences.version=1 encoding//WebRoot/console/webclient/cim.js=UTF-8 +encoding//src/main/java/com/farsunset/ichat/api/action/MessageAction.java=gbk encoding/=UTF-8 diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml b/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml index 7e428ed..6a6ea11 100644 --- a/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml +++ b/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-cim.xml @@ -14,7 +14,7 @@ > - + @@ -24,20 +24,23 @@ - - - + + + + + + - + \ No newline at end of file diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-push.xml b/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-push.xml index b7959fa..d4eab02 100644 --- a/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-push.xml +++ b/cim_for_netty/cim-server/WebRoot/WEB-INF/classes/spring-push.xml @@ -14,10 +14,10 @@ > - + - + \ No newline at end of file diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/commons-lang-2.3.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/commons-lang-2.3.jar new file mode 100644 index 0000000..c33b353 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/commons-lang-2.3.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/commons-lang3-3.1.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/commons-lang3-3.1.jar deleted file mode 100644 index a85e539..0000000 Binary files a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/commons-lang3-3.1.jar and /dev/null differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-all-5.0.0.Alpha2.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-all-5.0.0.Alpha2.jar deleted file mode 100644 index adcaa31..0000000 Binary files a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-all-5.0.0.Alpha2.jar and /dev/null differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-buffer-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-buffer-4.1.0.CR7.jar new file mode 100644 index 0000000..b850bdf Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-buffer-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-4.1.0.CR7.jar new file mode 100644 index 0000000..d0092b7 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-memcache-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-memcache-4.1.0.CR7.jar new file mode 100644 index 0000000..dd62cc8 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-memcache-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-socks-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-socks-4.1.0.CR7.jar new file mode 100644 index 0000000..6809c72 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-codec-socks-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-common-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-common-4.1.0.CR7.jar new file mode 100644 index 0000000..606e920 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-common-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-handler-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-handler-4.1.0.CR7.jar new file mode 100644 index 0000000..066c370 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-handler-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-handler-proxy-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-handler-proxy-4.1.0.CR7.jar new file mode 100644 index 0000000..deaba24 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-handler-proxy-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-resolver-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-resolver-4.1.0.CR7.jar new file mode 100644 index 0000000..7c90d37 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-resolver-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-transport-4.1.0.CR7.jar b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-transport-4.1.0.CR7.jar new file mode 100644 index 0000000..7dafa07 Binary files /dev/null and b/cim_for_netty/cim-server/WebRoot/WEB-INF/lib/netty-transport-4.1.0.CR7.jar differ diff --git a/cim_for_netty/cim-server/WebRoot/console/session/manage.jsp b/cim_for_netty/cim-server/WebRoot/console/session/manage.jsp index 80632c3..b3d9134 100644 --- a/cim_for_netty/cim-server/WebRoot/console/session/manage.jsp +++ b/cim_for_netty/cim-server/WebRoot/console/session/manage.jsp @@ -1,13 +1,13 @@ <%@ page language="java" pageEncoding="utf-8"%> -<%@ page import="java.util.Collection"%> -<%@ page import="com.farsunset.cim.server.session.CIMSession"%> +<%@ page import="java.util.List"%> +<%@ page import="com.farsunset.cim.sdk.server.session.CIMSession"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path; - Collection sessionList = (Collection)request.getAttribute("sessionList"); + List sessionList = (List )request.getAttribute("sessionList"); %> @@ -92,6 +92,7 @@ 头像 账号 终端 + 终端版本 应用版本 设备型号 在线时长 @@ -119,7 +120,10 @@ <%=ios.getChannel()%> - <%=ios.getAppVersion()==null?"":ios.getAppVersion()%> + <%=ios.getSystemVersion()==null?"":ios.getSystemVersion()%> + + + <%=ios.getClientVersion()==null?"":ios.getClientVersion()%> <%=ios.getDeviceModel()==null?"":ios.getDeviceModel()%> @@ -128,7 +132,7 @@ <%=(System.currentTimeMillis()-ios.getBindTime())/1000 %>秒 - <%=ios.getTag("location")==null?"":ios.getTag("location") %> + <%=ios.getAttribute("location")==null?"":ios.getAttribute("location") %>
diff --git a/cim_for_netty/cim-server/WebRoot/console/webclient/CIMBridge.swf b/cim_for_netty/cim-server/WebRoot/console/webclient/CIMBridge.swf index f54bac6..21c98cd 100644 Binary files a/cim_for_netty/cim-server/WebRoot/console/webclient/CIMBridge.swf and b/cim_for_netty/cim-server/WebRoot/console/webclient/CIMBridge.swf differ diff --git a/cim_for_netty/cim-server/WebRoot/console/webclient/MessageDialog.jsp b/cim_for_netty/cim-server/WebRoot/console/webclient/MessageDialog.jsp index c19bade..d465596 100644 --- a/cim_for_netty/cim-server/WebRoot/console/webclient/MessageDialog.jsp +++ b/cim_for_netty/cim-server/WebRoot/console/webclient/MessageDialog.jsp @@ -4,10 +4,9 @@ style="display: none; width: 500px; position: absolute;min-height: 600px;box-shadow: 0 0 10px -2px #0B203A;top:50px;left:50px;">
消息列表 -
-
+
请调用接口,或者在后台页面,推送一条消息到客户端
diff --git a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/admin/action/SessionAction.java b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/admin/action/SessionAction.java index 88e3fa8..2e9419b 100644 --- a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/admin/action/SessionAction.java +++ b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/admin/action/SessionAction.java @@ -1,3 +1,9 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.cim.admin.action; @@ -6,15 +12,15 @@ import java.io.IOException; import org.apache.struts2.ServletActionContext; import com.farsunset.cim.push.SystemMessagePusher; -import com.farsunset.cim.server.mutual.Message; -import com.farsunset.cim.server.session.DefaultSessionManager; +import com.farsunset.cim.sdk.server.model.Message; +import com.farsunset.cim.sdk.server.session.DefaultSessionManager; import com.farsunset.cim.util.ContextHolder; import com.opensymphony.xwork2.ActionSupport; public class SessionAction extends ActionSupport { /** * - */ + */ private static final long serialVersionUID = 1L; @@ -23,7 +29,7 @@ public class SessionAction extends ActionSupport { public String list() { - ServletActionContext.getRequest().setAttribute("sessionList", ((DefaultSessionManager) ContextHolder.getBean("defaultSessionManager")).getSessions()); + ServletActionContext.getRequest().setAttribute("sessionList", ((DefaultSessionManager) ContextHolder.getBean("CIMSessionManager")).queryAll()); return "list"; } @@ -37,7 +43,7 @@ public class SessionAction extends ActionSupport { msg.setReceiver(account); //向客户端 发送消息 - ContextHolder.getBean(SystemMessagePusher.class).pushMessageToUser(msg); + ContextHolder.getBean(SystemMessagePusher.class).push(msg); } } diff --git a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/api/action/MessageAction.java b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/api/action/MessageAction.java index fbd1daa..cae3ec3 100644 --- a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/api/action/MessageAction.java +++ b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/api/action/MessageAction.java @@ -1,16 +1,23 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.cim.api.action; import java.util.HashMap; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang.StringUtils; import org.apache.struts2.ServletActionContext; import org.springframework.web.bind.ServletRequestBindingException; import com.farsunset.cim.push.DefaultMessagePusher; import com.farsunset.cim.push.SystemMessagePusher; -import com.farsunset.cim.server.mutual.Message; +import com.farsunset.cim.sdk.server.model.Message; import com.farsunset.cim.util.Constants; import com.farsunset.cim.util.ContextHolder; +import com.farsunset.cim.util.StringUtil; import com.google.gson.Gson; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; @@ -43,15 +50,15 @@ public class MessageAction extends ActionSupport implements ModelDriven sessions =new HashMap(); - - - /** - * - */ public void addSession(String account,CIMSession session) { @@ -33,7 +30,7 @@ public class ClusterSessionManager implements SessionManager{ } - public CIMSession getSession(String account) { + public CIMSession get(String account) { //这里查询数据库 /*CIMSession session = database.getSession(account); @@ -43,39 +40,40 @@ public class ClusterSessionManager implements SessionManager{ } - - public Collection getSessions() { + @Override + public List queryAll() { /*//这里查询数据库 return database.getSessions();*/ return null; } - public void removeSession(CIMSession session) { - - - //database.removeSession(session.getAttribute(CIMConstant.SESSION_KEY));*/ - } - - public void removeSession(String account) { + @Override + public void remove(String account) { //database.removeSession(account);*/ } - - - public boolean containsCIMSession(CIMSession ios) - { - //return database.containsCIMSession(session.getAccount()); - - return false; - } - - public String getAccount(CIMSession ios) - { - return ios.getAccount(); - } + + @Override + public void setState(String account, int state) { + // TODO Auto-generated method stub + + } + + + @Override + public void update(CIMSession session) { + + } + + + @Override + public void add(String account, CIMSession session) { + // TODO Auto-generated method stub + + } diff --git a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/Constants.java b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/Constants.java index 6546848..024cdee 100644 --- a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/Constants.java +++ b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/Constants.java @@ -1,3 +1,9 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.cim.util; public interface Constants { @@ -42,32 +48,9 @@ public interface Constants { //用户之间的普通消息 public static final String TYPE_0 = "0"; - public static final String TYPE_1 = "1"; - //系统向用户发送的普通消息 public static final String TYPE_2 = "2"; - - //群里用户发送的 消息 - public static final String TYPE_3 = "3"; - - //系统定制消息---好友验证请求 - String TYPE_100 = "100"; - - //系统定制消息---同意好友请求 - String TYPE_101 = "101"; - - //系统定制消息---进群请求 - String TYPE_102 = "102"; - - //系统定制消息---同意进群请求 - String TYPE_103 = "103"; - - - //系统定制消息---好友下线消息 - String TYPE_900 = "900"; - - //系统定制消息---好友上线消息 - String TYPE_901 = "901"; + } } diff --git a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/ContextHolder.java b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/ContextHolder.java index ecfd01b..8f0a79a 100644 --- a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/ContextHolder.java +++ b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/ContextHolder.java @@ -1,13 +1,14 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.cim.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -/** - * spring 动态获取bean 实现 - * @author 3979434 - * - */ public class ContextHolder implements ApplicationContextAware{ private static ApplicationContext context; diff --git a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/MessageDispatcher.java b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/MessageDispatcher.java index 9a9c380..e835856 100644 --- a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/MessageDispatcher.java +++ b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/MessageDispatcher.java @@ -1,4 +1,9 @@ - +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.cim.util; import java.util.ArrayList; import java.util.List; @@ -17,7 +22,8 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; -import com.farsunset.cim.server.mutual.Message; +import com.farsunset.cim.sdk.server.model.Message; + public class MessageDispatcher { diff --git a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/StringUtil.java b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/StringUtil.java index 82fb185..c429684 100644 --- a/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/StringUtil.java +++ b/cim_for_netty/cim-server/src/main/java/com/farsunset/cim/util/StringUtil.java @@ -2,6 +2,7 @@ package com.farsunset.cim.util; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.UUID; public class StringUtil { @@ -45,6 +46,11 @@ public class StringUtil { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); return dateFormat.format(new Date()); } + + public static String getUUID() { + // TODO Auto-generated method stub + return UUID.randomUUID().toString().replaceAll("-", ""); + } } diff --git a/cim_for_netty/cim-server/src/main/resource/spring-cim.xml b/cim_for_netty/cim-server/src/main/resource/spring-cim.xml index 7e428ed..6a6ea11 100644 --- a/cim_for_netty/cim-server/src/main/resource/spring-cim.xml +++ b/cim_for_netty/cim-server/src/main/resource/spring-cim.xml @@ -14,7 +14,7 @@ > - + @@ -24,20 +24,23 @@ - - - + + + + + + - + \ No newline at end of file diff --git a/cim_for_netty/cim-server/src/main/resource/spring-push.xml b/cim_for_netty/cim-server/src/main/resource/spring-push.xml index b7959fa..d4eab02 100644 --- a/cim_for_netty/cim-server/src/main/resource/spring-push.xml +++ b/cim_for_netty/cim-server/src/main/resource/spring-push.xml @@ -14,10 +14,10 @@ > - + - + \ No newline at end of file diff --git a/cim_for_netty/client-mchat-android/AndroidManifest.xml b/cim_for_netty/client-mchat-android/AndroidManifest.xml index cd25be2..fafbada 100644 --- a/cim_for_netty/client-mchat-android/AndroidManifest.xml +++ b/cim_for_netty/client-mchat-android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2" + android:versionName="2.0.0" > @@ -10,10 +10,10 @@ - + + android:minSdkVersion="10" + android:targetSdkVersion="19" /> - - + + + - + + - + - diff --git a/cim_for_netty/client-mchat-android/libs/android-support-v4.jar b/cim_for_netty/client-mchat-android/libs/android-support-v4.jar deleted file mode 100644 index d006198..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/android-support-v4.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/cim-android-sdk-2.0.jar b/cim_for_netty/client-mchat-android/libs/cim-android-sdk-2.0.jar deleted file mode 100644 index 9afecc0..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/cim-android-sdk-2.0.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/cim-server-sdk-2.0.jar b/cim_for_netty/client-mchat-android/libs/cim-server-sdk-2.0.jar new file mode 100644 index 0000000..48ecc64 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/cim-server-sdk-2.0.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/fastjson-1.1.34.android.jar b/cim_for_netty/client-mchat-android/libs/fastjson-1.1.34.android.jar deleted file mode 100644 index bf50c46..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/fastjson-1.1.34.android.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/fastjson-1.1.47.android.jar b/cim_for_netty/client-mchat-android/libs/fastjson-1.1.47.android.jar new file mode 100644 index 0000000..9062508 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/fastjson-1.1.47.android.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-buffer-4.1.0.CR7.jar b/cim_for_netty/client-mchat-android/libs/netty-buffer-4.1.0.CR7.jar new file mode 100644 index 0000000..b850bdf Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/netty-buffer-4.1.0.CR7.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-buffer-5.0.0.Alpha2.jar b/cim_for_netty/client-mchat-android/libs/netty-buffer-5.0.0.Alpha2.jar deleted file mode 100644 index 039947c..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/netty-buffer-5.0.0.Alpha2.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-codec-4.1.0.CR7.jar b/cim_for_netty/client-mchat-android/libs/netty-codec-4.1.0.CR7.jar new file mode 100644 index 0000000..d0092b7 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/netty-codec-4.1.0.CR7.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-codec-5.0.0.Alpha2.jar b/cim_for_netty/client-mchat-android/libs/netty-codec-5.0.0.Alpha2.jar deleted file mode 100644 index f51892d..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/netty-codec-5.0.0.Alpha2.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-common-4.1.0.CR7.jar b/cim_for_netty/client-mchat-android/libs/netty-common-4.1.0.CR7.jar new file mode 100644 index 0000000..606e920 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/netty-common-4.1.0.CR7.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-common-5.0.0.Alpha2.jar b/cim_for_netty/client-mchat-android/libs/netty-common-5.0.0.Alpha2.jar deleted file mode 100644 index 894e7bb..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/netty-common-5.0.0.Alpha2.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-handler-4.1.0.CR7.jar b/cim_for_netty/client-mchat-android/libs/netty-handler-4.1.0.CR7.jar new file mode 100644 index 0000000..066c370 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/netty-handler-4.1.0.CR7.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-resolver-4.1.0.CR7.jar b/cim_for_netty/client-mchat-android/libs/netty-resolver-4.1.0.CR7.jar new file mode 100644 index 0000000..7c90d37 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/netty-resolver-4.1.0.CR7.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-resolver-5.0.0.Alpha2.jar b/cim_for_netty/client-mchat-android/libs/netty-resolver-5.0.0.Alpha2.jar deleted file mode 100644 index 113143f..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/netty-resolver-5.0.0.Alpha2.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-transport-4.1.0.CR7.jar b/cim_for_netty/client-mchat-android/libs/netty-transport-4.1.0.CR7.jar new file mode 100644 index 0000000..7dafa07 Binary files /dev/null and b/cim_for_netty/client-mchat-android/libs/netty-transport-4.1.0.CR7.jar differ diff --git a/cim_for_netty/client-mchat-android/libs/netty-transport-5.0.0.Alpha2.jar b/cim_for_netty/client-mchat-android/libs/netty-transport-5.0.0.Alpha2.jar deleted file mode 100644 index 299b3cc..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/netty-transport-5.0.0.Alpha2.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/slf4j-api-1.7.5.jar b/cim_for_netty/client-mchat-android/libs/slf4j-api-1.7.5.jar deleted file mode 100644 index 8766455..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/slf4j-api-1.7.5.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/libs/slf4j-nop-1.7.5.jar b/cim_for_netty/client-mchat-android/libs/slf4j-nop-1.7.5.jar deleted file mode 100644 index e55bdd8..0000000 Binary files a/cim_for_netty/client-mchat-android/libs/slf4j-nop-1.7.5.jar and /dev/null differ diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java index ac1fc61..a60ef9a 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/MessageTimeDescComparator.java @@ -1,8 +1,14 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.adapter; import java.util.Comparator; -import com.farsunset.cim.client.model.Message; +import com.farsunset.cim.sdk.android.model.Message; public class MessageTimeDescComparator implements Comparator{ diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java index 2dd2872..266b324 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/adapter/SystemMsgListViewAdapter.java @@ -1,17 +1,22 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.adapter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; - +import android.annotation.SuppressLint; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; - -import com.farsunset.cim.client.model.Message; +import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.ichat.example.R; import com.farsunset.ichat.example.ui.SystemMessageActivity; @@ -48,12 +53,12 @@ public class SystemMsgListViewAdapter extends BaseAdapter { { //Collections.sort(list, new MessageTimeDescComparator()); } + @SuppressLint("ViewHolder") @Override public View getView(int position, View chatItemView, ViewGroup parent) { final Message msg = getItem(position); - chatItemView =LayoutInflater.from(scactivity).inflate(R.layout.item_chat_sysmsg, null); diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java index 8eee807..560da3a 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CIMMonitorActivity.java @@ -1,26 +1,33 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.app; +import com.farsunset.cim.sdk.android.CIMEventListener; +import com.farsunset.cim.sdk.android.CIMListenerManager; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; import android.app.Activity; -import android.app.ProgressDialog; import android.net.NetworkInfo; import android.os.Bundle; -import android.widget.Toast; -import com.farsunset.cim.client.android.CIMEventListener; -import com.farsunset.cim.client.android.CIMListenerManager; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; - -public abstract class CIMMonitorActivity extends Activity implements CIMEventListener{ +public abstract class CIMMonitorActivity extends Activity implements CIMEventListener{ - private ProgressDialog progressDialog; + CommonBaseControl commonBaseControl; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CIMListenerManager.registerMessageListener(this,this); + + commonBaseControl = new CommonBaseControl(this); + + } @Override @@ -37,59 +44,47 @@ public abstract class CIMMonitorActivity extends Activity implements CIMEventL } - public void showProgressDialog(String title,String message) + public void showProgressDialog(String title,String content) { - if(progressDialog==null) - { - - progressDialog = ProgressDialog.show(this, title, message, true, true); - }else if(progressDialog.isShowing()) - { - progressDialog.setTitle(title); - progressDialog.setMessage(message); - } - - progressDialog.show(); - + commonBaseControl.showProgressDialog(title, content); } public void hideProgressDialog() { - - if(progressDialog!=null&&progressDialog.isShowing()) - { - progressDialog.dismiss(); - } - + commonBaseControl.hideProgressDialog(); } public void showToask(String hint){ - Toast toast=Toast.makeText(this,hint,Toast.LENGTH_SHORT); - toast.show(); + commonBaseControl.showToask(hint); } - - /** - * 与服务端断开连接时回调,不要再里面做连接服务端的操作 - */ - @Override - public void onCIMConnectionClosed(){}; - /** - * 与服务端断开连接时成功时回调 - */ + + @Override - public void onCIMConnectionSucceed() {} - @Override - public void onConnectionStatus(boolean isConnected){} - - @Override - public void onReplyReceived(ReplyBody reply) {} - - @Override - public void onMessageReceived(Message arg0) {} + public void onMessageReceived(Message arg0){}; @Override - public void onNetworkChanged(NetworkInfo info){}; + public void onNetworkChanged(NetworkInfo info){} + + /** + * 与服务端断开连接时回调,不要在里面做连接服务端的操作 + */ + @Override + public void onConnectionClosed() {} + + + /** + * 连接服务端成功时回调 + */ + + @Override + public void onConnectionSuccessed(boolean arg0) {} + + + @Override + public void onReplyReceived(ReplyBody arg0) {} + @Override + public void onConnectionFailed(Exception e){}; } diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java new file mode 100644 index 0000000..038bcfd --- /dev/null +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/CommonBaseControl.java @@ -0,0 +1,63 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ +package com.farsunset.ichat.example.app; + + + +import android.app.ProgressDialog; +import android.content.Context; +import android.widget.Toast; + + +public class CommonBaseControl { + + private ProgressDialog progressDialog; + + Context mContent; + + + public CommonBaseControl(Context content) + { + this.mContent = content; + } + + + + public void showProgressDialog(String title,String message) + { + if(progressDialog==null) + { + + progressDialog = ProgressDialog.show(mContent, title, message, true, true); + }else if(progressDialog.isShowing()) + { + progressDialog.setTitle(title); + progressDialog.setMessage(message); + } + + progressDialog.show(); + + } + + public void hideProgressDialog() + { + + if(progressDialog!=null&&progressDialog.isShowing()) + { + progressDialog.dismiss(); + } + + } + + public void showToask(String hint){ + + Toast toast=Toast.makeText(mContent,hint,Toast.LENGTH_SHORT); + toast.show(); + } + + +} diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java index 4d372be..bd6d5b9 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/app/Constant.java @@ -1,18 +1,15 @@ -package com.farsunset.ichat.example.app; - - - - - - /** + * probject:cim + * @version 2.0 * - * @version 1.0 - */ + * @author 3979434@qq.com + */ +package com.farsunset.ichat.example.app; + public interface Constant { - //服务端IP地址 - public static final String CIM_SERVER_HOST = "192.168.2.3"; + //服务端IP地址 + public static final String CIM_SERVER_HOST = "192.168.2.3"; //服务端web地址 public static final String SERVER_URL = "http://"+CIM_SERVER_HOST+":8080/cim-server"; diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java index 25513a8..5ddad4d 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIRequester.java @@ -1,10 +1,13 @@ - +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.network; import java.io.File; -import java.lang.reflect.Type; import java.nio.charset.Charset; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -20,18 +23,13 @@ import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.util.EntityUtils; - import android.os.Handler; import android.os.Message; - import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; public class HttpAPIRequester { HttpAPIResponser responser; - Type dataType; - Type dataListType; private static BlockingQueue queue = new LinkedBlockingQueue(); private static ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 20, TimeUnit.SECONDS,queue);; @@ -72,41 +70,20 @@ public class HttpAPIRequester { * @exception * @since 1.0.0 */ - public void execute( Type dtype , Type dltype, final String url) + public void execute( final String url) { - this.dataType = dtype; - this.dataListType = dltype; responser.onRequest(); executor.execute(new Runnable() { @Override public void run() { Message message = handler.obtainMessage(); - HashMap data = new HashMap(); + message.getData().putString("url", url); try { String dataString = httpPost(url,responser.getRequestParams()); - JSONObject json = JSON.parseObject(dataString); - data.put("code", json.getString("code")); - data.put("url", url); - if(json.containsKey("data") && dataType!=null) - { - dataString = json.getJSONObject("data").toJSONString(); - data.put("data", JSON.parseObject(dataString, dataType)); - } - if(json.containsKey("dataList") &&dataListType!=null ) - { - dataString = json.getJSONArray("dataList").toJSONString(); - data.put("list", JSON.parseObject(dataString, dataListType)); - } - - if(json.containsKey("page") &&json.getJSONObject("page")!=null) - { - dataString = json.getJSONObject("page").toJSONString(); - data.put("page", JSON.parseObject(dataString, Page.class)); - } - message.getData().putSerializable("data", data); + message.getData().putString("data", dataString); message.what = 0; } catch (Exception e) { e.printStackTrace(); @@ -157,18 +134,16 @@ public class HttpAPIRequester { Handler handler = new Handler(){ public void handleMessage(Message message) { - switch(message.what) + String url = message.getData().getString("url"); + switch(message.what) { case 0: - HashMap data =(HashMap) message.getData().getSerializable("data"); - Page page = (Page) data.get("page"); - List list = (List) data.get("list"); - String code = String.valueOf(data.get("code")); - responser.onSuccess(data.get("data"),list,page,String.valueOf(data.get("code")),data.get("url").toString()); + String data = message.getData().getString("data"); + responser.onSuccess(data,url); break; case 1: - responser.onFailed((Exception) message.getData().get("exception")); + responser.onFailed((Exception) message.getData().get("exception"),url); break; } diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java index c9edeb1..a59b8d2 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/HttpAPIResponser.java @@ -1,13 +1,17 @@ - +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.network; -import java.util.List; import java.util.Map; public interface HttpAPIResponser { - public void onSuccess(Object data,List list,Page page,String code,String url); - public void onFailed(Exception e); + public void onSuccess(String resulet,String url); + public void onFailed(Exception e,String url); public Map getRequestParams(); public void onRequest(); } diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/Page.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/Page.java deleted file mode 100644 index 13f2c3e..0000000 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/network/Page.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.farsunset.ichat.example.network; - -import java.io.Serializable; - -public class Page implements Serializable -{ - - /** - * serialVersionUID:TODO(用一句话描述这个变量表示什么) - * - * @since 1.0.0 - */ - private static final long serialVersionUID = 1L; - public int count; - public int size; - public int currentPage; - public int countPage; -} diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java index 7827bc2..4440f83 100644 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java +++ b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/receiver/CustomCIMMessageReceiver.java @@ -1,3 +1,9 @@ +/** + * probject:cim + * @version 2.0 + * + * @author 3979434@qq.com + */ package com.farsunset.ichat.example.receiver; @@ -7,12 +13,11 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.NetworkInfo; -import android.util.Log; -import com.farsunset.cim.client.android.CIMEventBroadcastReceiver; -import com.farsunset.cim.client.android.CIMListenerManager; -import com.farsunset.cim.client.model.Message; -import com.farsunset.cim.client.model.ReplyBody; +import com.farsunset.cim.sdk.android.CIMEventBroadcastReceiver; +import com.farsunset.cim.sdk.android.CIMListenerManager; +import com.farsunset.cim.sdk.android.model.Message; +import com.farsunset.cim.sdk.android.model.ReplyBody; import com.farsunset.ichat.example.R; import com.farsunset.ichat.example.ui.SystemMessageActivity; @@ -29,45 +34,22 @@ public final class CustomCIMMessageReceiver extends CIMEventBroadcastReceiver { //当收到消息时,会执行onMessageReceived,这里是消息第一入口 @Override - public void onMessageReceived(com.farsunset.cim.client.model.Message message) { + public void onMessageReceived(Message message) { - - for (int index = 0 ;index(){}.getType(), null, SEND_MESSAGE_API_URL); - + requester.execute(SEND_MESSAGE_API_URL); } @Override - public void onSuccess(Object data, List list, Page page, String code,String url) { + public void onSuccess(String data,String url) { hideProgressDialog(); - - if(CIMConstant.ReturnCode.CODE_200.equals(code)) - { - showToask("发送成功"); - } + showToask("发送成功"); } @Override public Map getRequestParams() { + + apiParams.put("content", "hello world!"); + apiParams.put("sender", "xiaogou");//发送者账号 + apiParams.put("receiver", "xiaomao");//消息接收者账号 + apiParams.put("type",Constant.MessageType.TYPE_0); + return apiParams; } @@ -168,7 +159,7 @@ public class SystemMessageActivity extends CIMMonitorActivity implements OnClick } @Override - public void onFailed(Exception e) {} + public void onFailed(Exception e,String url) {} @Override public void onBackPressed() { diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/util/FileDownloader.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/util/FileDownloader.java deleted file mode 100644 index cae709c..0000000 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/util/FileDownloader.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.farsunset.ichat.example.util; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.HashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; - -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - -/** - * 文件下载器 每秒2次跟新进度 - * - * @author Administrator - * - */ -public class FileDownloader { - - private DownloadHandler handler; - private static FileDownloader fileDownloader; - private static FileDownloadCallBack downloadCallBack; - private ThreadPoolExecutor downloadExecutor;// 下载线程执行器 - public static final int STATUS_STOP = 1; - - public static final int STATUS_AWAIT = 3; - public static final int STATUS_FAILED = 4; - public static final int STATUS_DONE = 200; - public static final int STATUS_RUNING = 0; - // 每个下载线程的状态记录 - private static HashMap STATUS_MAP = new HashMap(); - - // 每个文件的大小 byte - private static HashMap FILE_SIZE_MAP = new HashMap(); - - - // 每个下载线程的进度大小(byte) - private static HashMap PROGRESS_MAP = new HashMap(); - - private FileDownloader() { - - handler = new DownloadHandler(); - //支持3个线程同时下载 - downloadExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(3); - } - - public synchronized static FileDownloader getInstance() { - if (fileDownloader == null) { - fileDownloader = new FileDownloader(); - } - return fileDownloader; - } - - public String download(final String fileUrl, final File file) { - // 创建线程key - final String threadKey = fileUrl; - - // 创建下载任务,当运行的任务线程已经满了,则会等待,直到有下载线程完成 - downloadExecutor.execute(new Runnable() { - @Override - public void run() { - - STATUS_MAP.put(threadKey, STATUS_RUNING); - - HttpURLConnection conn = null; - InputStream is = null; - FileOutputStream fos = null; - - Message msg = new Message(); - Bundle bundle = new Bundle(); - bundle.putString("threadKey", threadKey); - msg.setData(bundle); - - try { - URL fielURL = new URL(fileUrl); - conn = (HttpURLConnection) fielURL.openConnection(); - - FILE_SIZE_MAP.put(threadKey, (long)conn.getContentLength()); - - if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { - msg.what = STATUS_FAILED; - handler.sendMessage(msg); - return; - } - - is = conn.getInputStream(); - fos = new FileOutputStream(file); - - - - PROGRESS_MAP.put(threadKey, 0l); - handler.sendMessageDelayed(msg, 200); - - byte buf[] = new byte[1024]; - int numread; - long downloadSize = 0; - - while ((numread = is.read(buf)) != -1) { - if (STATUS_MAP.get(threadKey) == STATUS_STOP) { - - msg = new Message(); - msg.what = STATUS_STOP; - handler.sendMessage(msg); - break; - } - fos.write(buf, 0, numread); - downloadSize += numread; - - PROGRESS_MAP.put(threadKey, downloadSize); - } - } catch (Exception e) { - - msg = new Message(); - msg.what = STATUS_FAILED; - handler.sendMessage(msg); - e.printStackTrace(); - } finally { - - try { - is.close(); - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - conn.disconnect(); - } - - STATUS_MAP.put(threadKey, STATUS_DONE); - } - }); - - - return threadKey; - } - - - /** - * 通过任务名称,停止下载 threadKey download()返回的任务名 - */ - public void setOnDownloadCallBack(FileDownloadCallBack callBack) { - downloadCallBack = callBack; - } - - /** - * 通过任务名称,停止下载 threadKey download()返回的任务名 - */ - public void stop(String threadKey) { - STATUS_MAP.put(threadKey, STATUS_STOP); - } - - - /** - * 停止所有下载任务 - */ - public void stopAll() { - for (String threadKey : STATUS_MAP.keySet()) { - stop(threadKey); - } - - } - - /** - * 停止所有下载任务 - */ - public void shutdown() { - downloadExecutor.shutdown(); - } - /** - * 销毁下载器 - */ - public void destroy() { - stopAll(); - downloadExecutor.shutdown(); - downloadExecutor = null; - fileDownloader = null; - } - - static class DownloadHandler extends Handler { - - private DownloadHandler() { - super(Looper.getMainLooper()); - } - - @Override - public void dispatchMessage(Message message) { - String threadKey = message.getData().getString("threadKey"); - switch (message.what) { - case STATUS_RUNING: - - downloadCallBack.progress(threadKey, FILE_SIZE_MAP.get(threadKey), PROGRESS_MAP.get(threadKey)); - - message = this.obtainMessage(); - message.getData().putString("threadKey", threadKey); - if(FILE_SIZE_MAP.get(threadKey).equals(PROGRESS_MAP.get(threadKey)) || STATUS_MAP.get(threadKey).equals(STATUS_DONE)) - { - message.what = STATUS_DONE; - } - - this.sendMessageDelayed(message, 200); - break; - case STATUS_STOP: - - downloadCallBack.statusChange(threadKey, STATUS_STOP); - break; - case STATUS_FAILED: - - downloadCallBack.statusChange(threadKey, STATUS_FAILED); - break; - case STATUS_DONE: - downloadCallBack.progress(threadKey, FILE_SIZE_MAP.get(threadKey), FILE_SIZE_MAP.get(threadKey)); - PROGRESS_MAP.remove(threadKey); - STATUS_MAP.remove(threadKey); - FILE_SIZE_MAP.remove(threadKey); - break; - } - - } - } - - public static interface FileDownloadCallBack { - public abstract void progress(String threadKey, long fileSize,long downloadSize); - public abstract void statusChange(String threadKey, int status); - } -} diff --git a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/util/StringUtil.java b/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/util/StringUtil.java deleted file mode 100644 index fe3806d..0000000 --- a/cim_for_netty/client-mchat-android/src/com/farsunset/ichat/example/util/StringUtil.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.farsunset.ichat.example.util; - -import java.text.SimpleDateFormat; -import java.util.Date; - -import android.content.Context; -import android.telephony.TelephonyManager; - - -public class StringUtil { - - - public static boolean isEmpty(Object obj) - { - - return null == obj || "".equals(obj.toString().trim()); - } - - public static boolean isNotEmpty(Object obj) - { - - return !isEmpty(obj); - } - public static String getSequenceId() - { - String mark = String.valueOf(System.currentTimeMillis()); - return mark; - } - - public static String getCurrentlyDateTime() { - SimpleDateFormat dateFormat = new SimpleDateFormat( - "yyyyMMddHHmmss"); - return dateFormat.format(new Date()); - } - - public static String transformDateTime(long t) { - Date date = new Date(t); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - return dateFormat.format(date); - } - - public static String getCurrentlyDate() { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); - return dateFormat.format(new Date()); - } - - public static String getIMEI(Context context) - { - return ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); - - } -} diff --git a/说明.txt b/说明.txt new file mode 100644 index 0000000..7d7739b --- /dev/null +++ b/说明.txt @@ -0,0 +1,4 @@ +1.cim-android-sdk androidͻ˷װĵjar +2.cim-server java weḅmyeclipseߣeclipseע޸±뻷 +3.cim-server-sdk cim-server õķװjar +4.client-mchat-android androidͻ \ No newline at end of file