聊天服务器-解密陌生人(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);
        }
    }
}
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
美团WebSocket客服聊天是美团为了提供更加便捷和实时的客户服务而采用的一种通信方式。所谓WebSocket,即浏览器与服务器之间基于HTTP协议的长连接,它能够实现双向通信,允许信息的实时传输。 美团通过使用WebSocket技术,使得客户能够与美团的客服人员进行实时的、双向的沟通。通过WebSocket客服聊天,用户可以随时向美团发起咨询、投诉或其他问题,而不需要通过传统的电话、邮件等方式进行沟通。这种即时性的沟通方式为用户提供了更加方便快捷的服务体验。 为了实现此功能,美团的后台服务器与前端客户端之间建立一个持续的连接,服务器会实时推送最新的消息给客户端,而客户端也可以随时向服务器发送消息。这种双向通信的机制使得客服聊天具有了实时性和互动性。 解密美团WebSocket客服聊天可能需要对WebSocket协议进行解析和分析。这种解密过程可能包括对网络数据包的抓包、协议解码、数据分析等技术手段。然而,这个过程需要具备专业的网络技术知识和相关工具的使用能力。 需要注意的是,解密美团WebSocket客服聊天的行为可能涉及到隐私和安全问题,因此个人不应该私自进行解密操作。用户在与美团客服聊天时所传输的信息应当受到保护,任何解密行为都需要获得双方的明确授权和法律合规。 总之,美团WebSocket客服聊天是美团为了提供更加便捷和实时的客户服务而使用的通信方式。解密WebSocket聊天可能涉及到专业的网络技术和相关工具的使用,个人不应私自进行解密操作,任何行为都需要获得授权和法律合规。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值