聊天服务器-解密陌生人(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);
        }
    }
}
时间: 2024-08-13 16:20:29

聊天服务器-解密陌生人(9)聊天消息转发的相关文章

聊天服务器-解密陌生人(11)群组管理和群组聊天

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请@我. 原工程:https://github.com/LineChen/ 八.群组管理 客户端可以发起多人聊天,周围一公里用户可以收到邀请,同意加入就可以进入多人聊天.一个用户默认情况下一天只能创建一个群组,群组从创建时计算24小时后自动解散. 下面是一个群组的相关信息:包括创建者.创建时间.群组Id.群组名称.主题.图标 public class GroupInfo { public String 

聊天服务器-解密陌生人(8)找回密码、修改个人信息

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我. 原工程:https://github.com/LineChen/ 二.找回密码 注意点: 1.找回密码不是简单的从数据库把密码取出来然后发送给用户.首先,数据库存储的密码是经过MD5转换的,无法得到密码明文,再说就算能得到,也不能发送密码明文给客户,不然这又违背了安全性原则. 2.这里是这样处理的:系统直接生成一个密码,然后修改数据库,然后把这个密码通过邮件方式发送给用户 发送邮件的类:

聊天服务器-解密陌生人(10)位置管理和获取周围一公里陌生人

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请@我. 原工程:https://github.com/LineChen/ 六.用户位置管理 客户端的操作是摇一摇发送自己的位置吧并在地图上显示周围一公里用户的名称(客户端定位服务用的是百度地图),为了保持位置的时效性, 控制每五分钟发送一次用户的位置.服务器端要保存每个开启位置服务的用户的位置,考虑到用户量可能会很大, 不可能把所有的用户保存在一个哈希表中,所以分省份来分组保存,实际处理中可能需要分市

通过python 构建一个简单的聊天服务器

构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使用 Telnet,客户机可以连接到 Python 聊天服务器上,并在全球范围内相互进行通信.提交到聊天服务器的消息可以由其他人进行查看(以及一些管理信息,例如客户机加入或离开聊天服务器).这个模型如图 1 所示. 图 1. 聊天服务器使用 select 方法来支持任意多个客户机 聊天服务器的一个重要

使用ServerSocket建立聊天服务器(二)

-------------siwuxie095 工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:MyServerSocket.java(主类).ServerListener.java.ChatSocket.java.ChatManager.java 工程结构目录如下: MyServerSocket.java(主类): package com.siwuxie095.socket; /** * 聊天服务器,不仅能向客户端发送数据,也能从客户端读取

定制的Server-Sent Events 聊天服务器

1 //匿名聊天服务器 2 //将新的消息POST到/chat地址,或者以GET形式从通一个URL获取文本或事件流 3 //创建一个GET请求到"/"来返回一个简单的HTML文件,这个文件包括客户端聊天UI 4 5 var http = require('http'); 6 7 //聊天客户端使用的HTML文件 8 var clientUI = require('fs').readFileSync("chatClient.html"); 9 var emulatio

27.app后端搭建聊天服务器的经历

现在,聊天功能已经成了社交app的标配了.但是,众多web开发出生的程序员对聊天相关的服务的不了解,带来了很多开发上的困扰.在这篇文章中,根据下面3个方面,谈谈聊天服务. 1.      聊天服务的技术选型 2.      开发社交app中,实现聊天服务踩过的坑 3.      那些著名app的聊天服务 1. 聊天服务的技术选型 需要开发聊天服务,首先要选择用到的协议,现在,常用的聊天协议有: (1)      xmpp,一个基于xml的消息协议,被广泛应用于Gtalk,Facebook,但缺点

基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件[转]

上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件.一步步很详细的介绍到简单插件开发,带Servlet的插件的开发.带JSP页面插件的开发,以及怎么样将开发好的插件打包.部署到openfire服务器. 如果你没有看上一篇文章的话,请你还是看看.http://www.cnblogs.com/hoojo/archive/2013/03/07/2947502.html 因为这篇文章是基于上篇文章讲叙的基础上完成插件开发.而且

7.持久聊天服务器

服务器准备部分: https://technet.microsoft.com/zh-cn/library/dn951388 https://technet.microsoft.com/zh-cn/library/gg398495 1.服务器基础配置和软件同标准版前端 2.安装 消息队列 3.标准版前端可以并置持久聊天服务器,企业版不可以并置 4.持久聊天服务器的数据存储和合规数据存储,需要SQL数据库支持,测试可以使用后端数据库(RTC实例), 持久聊天服务器角色安装部分: 1.使用拓扑生成器添