聊天伺服器-解密陌生人(9)聊天訊息轉寄,聊天伺服器陌生人
提示: 因為工程稍微有點大對我個人來說,所以可能在某些方面講的不清楚或邏輯性不夠強,如果有問題請@我。
原工程:https://github.com/LineChen/
五、轉寄資訊
因為用戶端和伺服器是保持長串連的,所以可以根據使用者Id得到使用者的會話session,得到session就可以發送訊息。
對於聊天,主要分聊天雙方都線上和一方離線的情況。都線上的情況好辦,直接轉寄;一方離線時,需要在資料庫中儲存離線訊息,等到離線好友登入時會發送給ta。儲存離線訊息需要注意的是,要根據訊息類型做相應的處理(簡訊、語音訊息、圖片訊息)。
/**
* 發送資訊給單個使用者
*
* @param moMoMsg
* @param getterId
*/
private void sendMsgToUser(iMoMoMsg moMoMsg, String getterId) {
if (ManageClientSession.isContainsId(getterId)) {
ManageClientSession.getSession(getterId).write(moMoMsg);
// System.out.println(“轉寄成功..”);
} else {
SqlModel model = new SqlModel();
if (!model.isTableExists(“mc_” + getterId))// “mc_” + userId
model.createCacheTable(getterId);// 建立快取資料庫
MsgDb msgDb = MsgTranceUtil.getInstance().Trance_Net2Db(moMoMsg);
if (model.insertCacheMsg(msgDb, getterId)) {
// System.out.println(“緩衝成功”);
} else {
// System.out.println(“緩衝失敗”);
}
}
}
下面是儲存在資料庫的離線訊息和發送的訊息轉化類:
package com.imomo_msg;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.server_utils.FileTools;
import com.server_utils.StaticValues;
/**
* 訊息包轉換工具
*
* @author Administrator
*
*/
public class MsgTranceUtil {
public static MsgTranceUtil getInstance() { return new MsgTranceUtil();}/** * 資料庫存數訊息轉化為網路傳輸訊息 * * @param msgDb * @return */public iMoMoMsg Trance_Db2Net(MsgDb msgDb) { iMoMoMsg moMsg = new iMoMoMsg(); switch (msgDb.msgType) { case iMoMoMsgTypes.CHATING_TEXT_MSG: moMsg.symbol = '+'; moMsg.msgJson = msgDb.msgJson; break; case iMoMoMsgTypes.CHATING_IMAGE_MSG: JSONObject json = JSON.parseObject(msgDb.msgJson); moMsg.symbol = '-'; String imagePath = json.getString(MsgKeys.imagePath); moMsg.msgBytes = FileTools.getInstance().getMultyFileBytes( imagePath); json.remove(MsgKeys.imagePath); moMsg.msgJson = json.toJSONString(); //刪除本機快取圖片 FileTools.getInstance().deleteFile(imagePath); break; case iMoMoMsgTypes.CHATING_VOICE_MSG: moMsg.symbol = '-'; JSONObject json2 = JSON.parseObject(msgDb.msgJson); String voicePath = json2.getString(MsgKeys.voicePath); moMsg.msgBytes = FileTools.getInstance().getMultyFileBytes( voicePath); json2.remove(MsgKeys.voicePath); moMsg.msgJson = json2.toJSONString(); FileTools.getInstance().deleteFile(voicePath); break; case iMoMoMsgTypes.ADD_FRIEND: moMsg.symbol = '+'; moMsg.msgJson = msgDb.msgJson; break; case iMoMoMsgTypes.RESET_HEAD: JSONObject resetHeadjson = JSON.parseObject(msgDb.msgJson); moMsg.symbol = '-'; String headPath = resetHeadjson.getString(MsgKeys.imagePath); moMsg.msgBytes = FileTools.getInstance().getMultyFileBytes( headPath); resetHeadjson.remove(MsgKeys.imagePath); moMsg.msgJson = resetHeadjson.toJSONString(); //刪除本機快取圖片 FileTools.getInstance().deleteFile(headPath); break; } return moMsg;}/** * 網路訊息轉化為資料庫儲存訊息 * * @param moMsg * @return */public MsgDb Trance_Net2Db(iMoMoMsg moMsg) { MsgDb msgDb = new MsgDb(); JSONObject json = JSON.parseObject(moMsg.msgJson); int msgtype = json.getIntValue(MsgKeys.msgType); switch (msgtype) { case iMoMoMsgTypes.CHATING_TEXT_MSG: break; case iMoMoMsgTypes.CHATING_IMAGE_MSG: String imagePath = StaticValues.MSG_CACHE_IMA_P_PATH + json.getString(MsgKeys.userId) + "_" + System.currentTimeMillis() + ".png"; FileTools.getInstance().saveMultyFile(imagePath, moMsg.msgBytes); json.put(MsgKeys.imagePath, imagePath); break; case iMoMoMsgTypes.CHATING_VOICE_MSG: String voicePath = StaticValues.MSG_CACHE_VOI_P_PATH + json.getString(MsgKeys.userId) + "_" + System.currentTimeMillis() + ".amr"; FileTools.getInstance().saveMultyFile(voicePath, moMsg.msgBytes); json.put(MsgKeys.voicePath, voicePath); break; case iMoMoMsgTypes.ADD_FRIEND:
// String headPath = StaticValues.HEAD_P_PATH
// + json.getString(MsgKeys.userId) + “.png”;
// json.put(MsgKeys.imagePath, headPath);
break;
case iMoMoMsgTypes.RESET_HEAD: String headPath = StaticValues.MSG_CACHE_IMA_P_PATH + json.getString(MsgKeys.userId) + "_" + System.currentTimeMillis() + ".png"; FileTools.getInstance().saveMultyFile(headPath, moMsg.msgBytes); json.put(MsgKeys.imagePath, headPath); break; } msgDb.msgType = msgtype; msgDb.msgJson = json.toJSONString(); return msgDb;}
}
然後是轉寄離線訊息:
/**
* 轉寄離線訊息
*
* @param session
* @param userId
* @param model
*/
private void sendCacheMsg(IoSession session, String userId, SqlModel model) {
if (model.isTableExists(“mc_” + userId)) {
if (model.getMsgCount(userId) > 0) {
// 說明有離線訊息
List list = model.getCacheMsgs(userId);
for (MsgDb msgDb : list) {
iMoMoMsg moMsg = MsgTranceUtil.getInstance().Trance_Db2Net(
msgDb);
session.write(moMsg); } // 清空資料庫離線檔案 model.clearMsgCache(userId); } }}