聊天伺服器-解密陌生人(9)聊天訊息轉寄,聊天伺服器陌生人

來源:互聯網
上載者:User

聊天伺服器-解密陌生人(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);        }    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.