码迷,mamicode.com
首页 > 其他好文 > 详细

解密陌生人(5)处理各种消息

时间:2015-06-17 09:37:38      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:服务器   业务逻辑   server   

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我。

原工程:https://github.com/LineChen/

(4)已经说了怎么构造一条消息。这篇要说的就是处理各种业务逻辑的具体。
package com.imomo_server;

import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.util.Date;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.imomo_msg.MsgKeys;
import com.imomo_msg.iMoMoMsg;
import com.imomo_msg.iMoMoMsgTypes;
import com.managers.ManageClientSession;
import com.managers.ManageIdSessions;
import com.managers.ManageLocMap;

public class iMomoServerHandler extends IoHandlerAdapter {

private IoSession session;

@Override
public void exceptionCaught(IoSession session, Throwable cause)
        throws Exception {
    super.exceptionCaught(session, cause);
    // cause.printStackTrace();
}

@Override
public void inputClosed(IoSession session) throws Exception {
    super.inputClosed(session);
}

public void messageReceived(IoSession session, Object message)
        throws Exception {
    super.messageReceived(session, message);
    this.session = session;
    iMoMoMsg moMoMsg = (iMoMoMsg) message;
    JSONObject msgJson = JSON.parseObject(moMoMsg.msgJson);

// System.out.println(“接收到消息”);
// ManageClientSession.addSession(“9091”, session);
// System.out.println(“服务器接收:” + moMoMsg.toString());
if (moMoMsg.symbol == ‘+’) {
switch (msgJson.getInteger(MsgKeys.msgType)) {
case iMoMoMsgTypes.FIND_PASSWD:
// 找回密码:
ServerUtils.getInstance().handleFindPasswd(session, moMoMsg);
break;

        // ----------------修改个人信息--------------------------------//
        case iMoMoMsgTypes.RESET_PASSWD:
            // 重置密码:
            ServerUtils.getInstance().handleResetPasswd(session, moMoMsg);
            break;

        case iMoMoMsgTypes.RESET_USERNAME:
            // 修改用户名:
            ServerUtils.getInstance().handleResetUserInfo(moMoMsg);
            break;
        case iMoMoMsgTypes.RESET_SEX:
            // 修改性别:
            ServerUtils.getInstance().handleResetUserInfo(moMoMsg);
            break;
        case iMoMoMsgTypes.RESET_BIRTHDAY:
            // 修改生日:
            ServerUtils.getInstance().handleResetUserInfo(moMoMsg);
            break;
        case iMoMoMsgTypes.RESET_SIGNATUE:
            // 修改个人签名:
            ServerUtils.getInstance().handleResetUserInfo(moMoMsg);
            break;
        // ----------------修改个人信息--------------------------------//

        // ------------------登录---------------------------//
        case iMoMoMsgTypes.LOGIN:
            // 用户登录:
            ServerUtils.getInstance().handleLogin(session, moMoMsg);
            break;
        case iMoMoMsgTypes.LOGIN_SUPER_HEAD:
            // 用户超级登录有头像:
            ServerUtils.getInstance().handleLoginSuper(session, moMoMsg);
            break;
        case iMoMoMsgTypes.LOGIN_SUPER_NOHEAD:
            // 用户超级登录无头像:
            ServerUtils.getInstance().handleLoginSuper(session, moMoMsg);
            break;
        // ------------------登录---------------------------//

        case iMoMoMsgTypes.CHATING_TEXT_MSG:
            // 文本信息:
            ServerUtils.getInstance().handleChatMsg(moMoMsg);
            break;

        // ------------------位置相关服务-----------------------//
        case iMoMoMsgTypes.LOCATION:
            // 用户地理位置消息
            ServerUtils.getInstance().handleLocation(moMoMsg);
            break;
        case iMoMoMsgTypes.GET_STRANGERS_LOC_ONEKM:
            // 请求得到周围一公里陌生人位置
            ServerUtils.getInstance().handleGetStrangersLoc(moMoMsg);
            break;

        case iMoMoMsgTypes.GET_STRANGERS_LOC_MORE:
            // 请求得到周围大于一公里内陌生人位置
            ServerUtils.getInstance().handleGetStrangersLoc(moMoMsg);
            break;

        case iMoMoMsgTypes.GET_STRANGER_INFO:
            // 请求得到周围大于一公里内陌生人位置
            ServerUtils.getInstance().handleGetFriendInfo(session, moMoMsg);
            break;
        // ------------------位置相关服务-----------------------//



        case iMoMoMsgTypes.GETA_FRIEND_INFO_HEAD:
            // 请求得到一个陌生人的具体信息,不用发头像
            ServerUtils.getInstance().handleGetFriendInfo(session, moMoMsg);
            break;
        case iMoMoMsgTypes.GETA_FRIEND_INFO_NOHEAD:
            // 请求得到一个陌生人的具体信息,要发头像
            ServerUtils.getInstance().handleGetFriendInfo(session, moMoMsg);
            break;

        case iMoMoMsgTypes.ADD_FRIEND:
            // 添加好友
            ServerUtils.getInstance().handleAddFriend(session, moMoMsg);
            break;
        case iMoMoMsgTypes.DELETE_FRIEND:
            // 删除好友
            ServerUtils.getInstance().handleDeleteFriend(session, moMoMsg);
            break;

        case iMoMoMsgTypes.GET_FRIEND_ID_LIST:
            // 获得好友Id列表
            ServerUtils.getInstance().handleGetFriendIdList(session, moMoMsg);
            break;  

        case iMoMoMsgTypes.REBACK:
            // 用户反馈
            ServerUtils.getInstance().handleReback(moMoMsg);
            break;  

        case iMoMoMsgTypes.SIGN:
            // 用户签到
            ServerUtils.getInstance().handleVitality(moMoMsg);
            break;  
        case iMoMoMsgTypes.PASS_GAME:
            // 用户签到
            ServerUtils.getInstance().handleVitality(moMoMsg);
            break;

        case iMoMoMsgTypes.AGREEE_TO_GROUP:
            ServerUtils.getInstance().handleRecieveToGroup(moMoMsg);
            break;

        }

    } else if (moMoMsg.symbol == ‘-‘) {
        switch (msgJson.getInteger(MsgKeys.msgType)) {
        case iMoMoMsgTypes.REGISTER:
            // 注册:
            ServerUtils.getInstance().handleRegister(session, moMoMsg);
            break;
        case iMoMoMsgTypes.RESET_HEAD:
            // 修改头像:
            ServerUtils.getInstance().handleResetHead(session, moMoMsg);
            break;
        case iMoMoMsgTypes.CHATING_IMAGE_MSG:
            // 图片消息:
            ServerUtils.getInstance().handleChatMsg(moMoMsg);
            break;
        case iMoMoMsgTypes.CHATING_VOICE_MSG:
            // 语音消息:
            ServerUtils.getInstance().handleChatMsg(moMoMsg);
            break;

        case iMoMoMsgTypes.CREATE_GROUP:
            // 注册:
            ServerUtils.getInstance().handleCreateGroup(session, moMoMsg);
            break;
        }

    }

}

@Override
public void messageSent(IoSession session, Object message) throws Exception {
    super.messageSent(session, message);
}

@Override
public void sessionClosed(IoSession session) throws Exception {
    super.sessionClosed(session);
    long sessionId = session.getId();
    if (ManageIdSessions.isContainsId(sessionId)) {
        // 说明是长连接的Id,需要及时删除保存的会话
        String userId = ManageIdSessions.getUserId(sessionId);
        ManageIdSessions.deleteUserId(sessionId);
        ManageClientSession.deleteSession(userId);
        // 删除位置
        ManageLocMap.deleteOneUser(userId);
    }

// System.out.println(“关闭” + session);
}

@Override
public void sessionCreated(IoSession session) throws Exception {
    super.sessionCreated(session);
}

@Override
public void sessionIdle(IoSession session, IdleStatus status)
        throws Exception {
    super.sessionIdle(session, status);
}

@Override
public void sessionOpened(IoSession session) throws Exception {
    super.sessionOpened(session);

// System.out.println(“连接+” + session);
}
}

这里可以得到各种不同的消息,然后要进行相应的处理。这里先贴上处理的代码。
package com.imomo_server;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.swing.text.MaskFormatter;

import org.apache.mina.core.session.IoSession;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.database.SqlModel;
import com.imomo_msg.MsgDb;
import com.imomo_msg.MsgKeys;
import com.imomo_msg.MsgTranceUtil;
import com.imomo_msg.StrangerBean;
import com.imomo_msg.iMoMoMsg;
import com.imomo_msg.iMoMoMsgTypes;
import com.imomo_msg.myLocationBean;
import com.managers.GroupInfo;
import com.managers.ManageAProvinceLoc;
import com.managers.ManageClientSession;
import com.managers.ManageGroups;
import com.managers.ManageIdSessions;
import com.managers.ManageLocMap;
import com.server_utils.FileTools;
import com.server_utils.PasswordUtil;
import com.server_utils.StaticValues;
import com.server_utils.SendEmailToClient;

/**
* 服务器辅助类
*
* @author Administrator
*
*/
public class ServerUtils {

static ServerUtils serverUtils;

public static ServerUtils getInstance() {
    // if (serverUtils == null) {
    // serverUtils = new ServerUtils();
    // }
    return new ServerUtils();
}

/**
 * 处理注册
 * 
 * @param session
 *            会话
 * @param moMsg
 *            消息包
 */
public void handleRegister(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    SqlModel model = new SqlModel();
    String userEmail = json.getString(MsgKeys.userEmail);
    String userId = model.allocateId();// 分配Id
    String userHeadPath = StaticValues.HEAD_P_PATH + userId + ".png";
    FileTools.getInstance().saveMultyFile(userHeadPath, moMoMsg.msgBytes);
    String sql = "insert into imomo_clients values (?,?,?,?,?,?,?,?,?)";
    String[] paras = { userId, userEmail, json.getString(MsgKeys.userName),
            json.getString(MsgKeys.userPasswd), userHeadPath,
            json.getString(MsgKeys.userSex),
            json.getString(MsgKeys.userBirthday), "" , 0+""};
    iMoMoMsg Notify = new iMoMoMsg();
    Notify.symbol = ‘+‘;
    JSONObject NotifyJson = new JSONObject();
    if (model.updateDb(sql, paras)) {
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.REGISTER_SUCCESS);
        System.out.println("注册成功");
    } else {
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.REGISTER_FAILED);// 注册失败
    }
    Notify.msgJson = NotifyJson.toJSONString();
    session.write(Notify);
}

/**
 * 处理找回密码
 * 
 * @param session
 * @param moMoMsg
 */
public void handleFindPasswd(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userEmail = json.getString(MsgKeys.userEmail);// 邮箱地址
    SqlModel model = new SqlModel();
    String userName = model.getUserName(userEmail, true);
    iMoMoMsg Notify = new iMoMoMsg();
    Notify.symbol = ‘+‘;
    JSONObject NotifyJson = new JSONObject();
    String newPwd = PasswordUtil.getInstance().createNewPwd();

// System.out.println(“newPwd = ” + newPwd);
// System.out.println(“newPwd - MD5 = ”
// + PasswordUtil.getInstance().toMD5(newPwd));
if (!userName.equals(“null”)) {
String sql = “update imomo_clients set userPasswd = ? where userEmail = ?”;
String[] paras = { PasswordUtil.getInstance().toMD5(newPwd),
userEmail };
if (model.updateDb(sql, paras)) {
// 发送邮件…
new SendEmailToClient(userEmail, “找回密码”, “尊敬的” + userName
+ “:\n 您好,系统为您随机生成的密码是:” + newPwd + “,登录后请尽快修改密码!”);
NotifyJson.put(MsgKeys.msgType,
iMoMoMsgTypes.FIND_PASSWD_SUCCESS);
} else {
NotifyJson.put(MsgKeys.msgType,
iMoMoMsgTypes.FIND_PASSWD_FAILED);
}
} else {
System.out.println(“没有该用户”);
NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.FIND_PASSWD_FAILED);
}
Notify.msgJson = NotifyJson.toJSONString();
session.write(Notify);
}

/**
 * 处理重置密码
 * 
 * @param session
 * @param moMoMsg
 */
public void handleResetPasswd(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    SqlModel model = new SqlModel();
    String sql = "update imomo_clients set userPasswd = ? where userId = ?";
    String[] paras = { json.getString(MsgKeys.userPasswd), userId };
    iMoMoMsg Notify = new iMoMoMsg();
    Notify.symbol = ‘+‘;
    JSONObject NotifyJson = new JSONObject();
    if (model.updateDb(sql, paras)) {
        System.out.println("修改密码成功");
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_PASSWD_SUCCESS);
    } else {
        System.out.println("修改密码失败");
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_PASSWD_FAILED);
    }
    Notify.msgJson = NotifyJson.toJSONString();
    session.write(Notify);
}

/**
 * 处理修改用户名
 * 
 * @param moMoMsg
 */
public void handleResetUserInfo(iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    int type = json.getIntValue(MsgKeys.msgType);
    SqlModel model = new SqlModel();
    String sql = "";
    String[] paras = new String[2];
    switch (type) {
    case iMoMoMsgTypes.RESET_USERNAME:
        sql = "update imomo_clients set userName = ? where userId = ?";
        paras[0] = json.getString(MsgKeys.userName);
        break;
    case iMoMoMsgTypes.RESET_SEX:
        sql = "update imomo_clients set userSex = ? where userId = ?";
        paras[0] = json.getString(MsgKeys.userSex);
        break;
    case iMoMoMsgTypes.RESET_BIRTHDAY:
        sql = "update imomo_clients set userBirthday = ? where userId = ?";
        paras[0] = json.getString(MsgKeys.userBirthday);
        break;
    case iMoMoMsgTypes.RESET_SIGNATUE:
        sql = "update imomo_clients set personSignature = ? where userId = ?";
        paras[0] = json.getString(MsgKeys.personSignature);
        break;
    }
    paras[1] = userId;
    if (model.updateDb(sql, paras)) {
        System.out.println("修改用信息成功");
    } else {
        System.out.println("修改用户信失败");
    }
    // 不发送通知消息
}

/**
 * 处理修改头像
 * 
 * @param session
 * @param moMoMsg
 */
public void handleResetHead(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    String userHeadPath = StaticValues.HEAD_P_PATH + userId + ".png";
    iMoMoMsg Notify = new iMoMoMsg();
    Notify.symbol = ‘+‘;
    JSONObject NotifyJson = new JSONObject();
    try {
        FileTools.getInstance().saveMultyFile(userHeadPath,
                moMoMsg.msgBytes);
        // 修改成功
        System.out.println("修改头像成功");
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_HEAD_SUCCESS);

        SqlModel model = new SqlModel();
        String[] friendList = model.getFriendIds(userId);
        iMoMoMsg resetHead = new iMoMoMsg();
        resetHead.symbol = ‘-‘;
        JSONObject resetHeadJson = new JSONObject();
        resetHeadJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_HEAD);
        resetHeadJson.put(MsgKeys.friendId, userId);// 通知好友是谁改头像的
        resetHeadJson.put(MsgKeys.userId, userId);// 我发的
        resetHead.msgJson = resetHeadJson.toJSONString();
        resetHead.msgBytes = moMoMsg.msgBytes;
        for (String friendId : friendList) {
            // 判断是否在线,在线直接转发,不在线缓存到数据库中
            if (ManageClientSession.isContainsId(friendId)) {
                ManageClientSession.getSession(friendId).write(resetHead);

// System.out.println(“转发成功..”);
} else {
if (!model.isTableExists(“mc_” + friendId))// “mc_” + userId
model.createCacheTable(friendId);// 创建缓存数据库
MsgDb msgDb = MsgTranceUtil.getInstance().Trance_Net2Db(
resetHead);
if (model.insertCacheMsg(msgDb, friendId)) {
// System.out.println(“缓存成功”);
} else {
// System.out.println(“缓存失败”);
}
}
}

    } catch (Exception e) {
        // 修改失败
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.RESET_HEAD_FAILED);

// System.out.println(“修改头像失败”);
}
Notify.msgJson = NotifyJson.toJSONString();
session.write(Notify);
}

/**
 * 处理用户登录
 * 
 * @param session
 * @param moMoMsg
 */
public void handleLogin(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    iMoMoMsg Notify = new iMoMoMsg();
    Notify.symbol = ‘+‘;
    JSONObject NotifyJson = new JSONObject();
    if (new SqlModel().checkUser(json.getString(MsgKeys.userEmail),
            json.getString(MsgKeys.userPasswd))) {

// System.out.println(“合法用户”);
// 合法用户
NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.LOGIN_SUCCESS);
} else {
// 非法用户
// System.out.println(“非法用户”);
NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.LOGIN_FAILED);
}
Notify.msgJson = NotifyJson.toJSONString();
session.write(Notify);
}

/**
 * 处理用户超级登录
 * 
 * @param session
 * @param moMoMsg
 */
public void handleLoginSuper(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    SqlModel model = new SqlModel();
    String userEmail = json.getString(MsgKeys.userEmail);
    int msgtype = json.getIntValue(MsgKeys.msgType);
    JSONObject info = model.getUserInfo(userEmail, true);
    String userId = info.getString(MsgKeys.userId);
    iMoMoMsg Notify = new iMoMoMsg();
    JSONObject NotifyJson = new JSONObject();
    if (info != null) {
        // 获得用户信息成功
        // 管理会话 、Id
        ManageIdSessions.addUserId(session.getId(), userId);
        ManageClientSession.addSession(info.getString(MsgKeys.userId),
                session);
        NotifyJson.put(MsgKeys.userId, userId);
        NotifyJson.put(MsgKeys.userName, info.getString(MsgKeys.userName));
        NotifyJson.put(MsgKeys.userSex, info.getString(MsgKeys.userSex));
        NotifyJson.put(MsgKeys.userBirthday,
                info.getString(MsgKeys.userBirthday));
        NotifyJson.put(MsgKeys.personSignature,
                info.getString(MsgKeys.personSignature));
        NotifyJson.put(MsgKeys.vitalityValue,
                info.getIntValue(MsgKeys.vitalityValue));
        if (msgtype == iMoMoMsgTypes.LOGIN_SUPER_HEAD) {
            Notify.symbol = ‘+‘;
            NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.LOGIN_SUPER_HEAD);
            System.out.println("用户本地有头像");
        } else if (msgtype == iMoMoMsgTypes.LOGIN_SUPER_NOHEAD) {
            System.out.println("用户本地无头像");
            Notify.symbol = ‘-‘;
            NotifyJson.put(MsgKeys.msgType,
                    iMoMoMsgTypes.LOGIN_SUPER_NOHEAD);
            Notify.msgBytes = FileTools.getInstance().getMultyFileBytes(
                    info.getString(MsgKeys.userHeadPath));
        }
    } else {
        NotifyJson.put(MsgKeys.msgType, iMoMoMsgTypes.LOGIN_SUPER_FAILED);
    }
    Notify.msgJson = NotifyJson.toJSONString();
    session.write(Notify);
    // 判断是否有离线消息,有则转发,
    sendCacheMsg(session, userId, model);
}

/**
 * 转发离线消息
 * 
 * @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<MsgDb> list = model.getCacheMsgs(userId);
            for (MsgDb msgDb : list) {
                iMoMoMsg moMsg = MsgTranceUtil.getInstance().Trance_Db2Net(
                        msgDb);

                session.write(moMsg);
            }
            // 清空数据库离线文件
            model.clearMsgCache(userId);
        }
    }
}

/**
 * 处理用户位置消息,记录用户的位置
 * 
 * @param moMoMsg
 */
public void handleLocation(iMoMoMsg moMoMsg) {
    JSONObject loc_json = JSON.parseObject(moMoMsg.msgJson);
    String userId = loc_json.getString(MsgKeys.userId);
    String province = loc_json.getString(MsgKeys.loc_province);
    myLocationBean locationBean = new myLocationBean();
    locationBean.province = province;
    locationBean.longitude = loc_json.getDoubleValue(MsgKeys.loc_Longitude);
    locationBean.latitude = loc_json.getDoubleValue(MsgKeys.loc_Latitude);
    System.out.println(locationBean.toString());
    if (ManageLocMap.isContainsProvince(province)) {
        ManageLocMap.getAProvinceLoc(province).addLocation(userId,
                locationBean);// 添加到所在省
    } else {
        ManageAProvinceLoc AProvinceLoc = new ManageAProvinceLoc(province);
        AProvinceLoc.addLocation(userId, locationBean);
        ManageLocMap.addAProvinceLoc(province, AProvinceLoc);
    }
}

/**
 * 处理请求得到周围陌生人位置
 * 
 * @param moMoMsg
 */
public void handleGetStrangersLoc(iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    int type = json.getIntValue(MsgKeys.msgType);
    String userId = json.getString(MsgKeys.userId);
    String province = json.getString(MsgKeys.loc_province);
    double longitude = json.getDoubleValue(MsgKeys.loc_Longitude);
    double latitude = json.getDoubleValue(MsgKeys.loc_Latitude);
    // 计算距离,然后获取陌生人信息(姓名,Id,位置)
    iMoMoMsg moMsg = new iMoMoMsg();
    moMsg.symbol = ‘+‘;
    JSONObject jsonSend = new JSONObject();

    if (type == iMoMoMsgTypes.GET_STRANGERS_LOC_ONEKM) {
        // 一公里内
        // /** 测试... */
        // List<StrangerBean> list = new ManageAProvinceLoc("sd")
        // .getDisStrangers(true, userId, 0);
        // JSONArray jsonArray = (JSONArray) JSONArray.toJSON(list);
        // jsonSend.put(MsgKeys.msgType,
        // iMoMoMsgTypes.STRANGERS_LIST_ONEKM);
        // jsonSend.put(MsgKeys.strangerList, jsonArray);

        if (ManageLocMap.isContainsProvince(province)) {
            // 当前省有在线用户
            ManageAProvinceLoc aProvinceLoc = ManageLocMap
                    .getAProvinceLoc(province);
            if (aProvinceLoc.getCount() > 1) {
                List<StrangerBean> list = aProvinceLoc.getDisStrangers(
                        true, userId, 0);
                JSONArray jsonArray = (JSONArray) JSONArray.toJSON(list);
                jsonSend.put(MsgKeys.msgType,
                        iMoMoMsgTypes.STRANGERS_LIST_ONEKM);
                jsonSend.put(MsgKeys.strangerList, jsonArray);
            } else {
                jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.NO_STRANGERS);
            }
        } else {
            jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.NO_STRANGERS);
        }

    } else if (type == iMoMoMsgTypes.GET_STRANGERS_LOC_MORE) {
        // 大于一公里
        int distRange = json.getIntValue(MsgKeys.distRange);

        // /** 测试... */
        // List<StrangerBean> list = new ManageAProvinceLoc("sd")
        // .getDisStrangers(false, userId, distRange);
        // JSONArray jsonArray = (JSONArray) JSONArray.toJSON(list);
        // jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.STRANGERS_LIST_MORE);
        // jsonSend.put(MsgKeys.strangerList, jsonArray);

        // System.out.println("大于一公里 : " + jsonSend.toJSONString());
        if (ManageLocMap.isContainsProvince(province)) {
            // 当前省有在线用户
            ManageAProvinceLoc aProvinceLoc = ManageLocMap
                    .getAProvinceLoc(province);
            if (aProvinceLoc.getCount() > 1) {
                List<StrangerBean> list = aProvinceLoc.getDisStrangers(
                        false, userId, distRange);
                JSONArray jsonArray = (JSONArray) JSONArray.toJSON(list);
                jsonSend.put(MsgKeys.msgType,
                        iMoMoMsgTypes.STRANGERS_LIST_MORE);
                jsonSend.put(MsgKeys.strangerList, jsonArray);
            } else {
                jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.NO_STRANGERS);
            }
        } else {
            jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.NO_STRANGERS);
        }
    }

    moMsg.msgJson = jsonSend.toJSONString();
    ManageClientSession.getSession(userId).write(moMsg);
}

/**
 * 处理请求得到一个陌生人的具体信息,(区分本地有头像 无头像)
 * 
 * @param moMoMsg
 */
public void handleGetFriendInfo(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    int type = json.getInteger(MsgKeys.msgType);
    String userId = json.getString(MsgKeys.userId);
    String friendId = json.getString(MsgKeys.friendId);
    SqlModel model = new SqlModel();
    JSONObject info = model.getUserInfo(friendId, false);
    iMoMoMsg moMsg = new iMoMoMsg();
    if (type == iMoMoMsgTypes.GETA_FRIEND_INFO_HEAD) {
        moMsg.symbol = ‘+‘;
        info.put(MsgKeys.msgType, iMoMoMsgTypes.GETA_FRIEND_INFO_HEAD);
    } else if (type == iMoMoMsgTypes.GETA_FRIEND_INFO_NOHEAD) {
        String headPath = info.getString(MsgKeys.userHeadPath);
        moMsg.msgBytes = FileTools.getInstance()
                .getMultyFileBytes(headPath);
        moMsg.symbol = ‘-‘;
        info.put(MsgKeys.msgType, iMoMoMsgTypes.GETA_FRIEND_INFO_NOHEAD);

    } else if (type == iMoMoMsgTypes.GET_STRANGER_INFO) {
        String headPath = info.getString(MsgKeys.userHeadPath);
        moMsg.msgBytes = FileTools.getInstance()
                .getMultyFileBytes(headPath);
        moMsg.symbol = ‘-‘;
        info.put(MsgKeys.msgType, iMoMoMsgTypes.GET_STRANGER_INFO);
    }
    info.remove(MsgKeys.userHeadPath);
    moMsg.msgJson = info.toJSONString();
    session.write(moMsg);
    // ManageClientSession.getSession(userId).write(moMsg);
}

/**
 * 处理添加好友
 * 
 * @param session
 * @param moMoMsg
 */
public void handleAddFriend(IoSession session, iMoMoMsg moMoMsg) {

// System.out.println(“添加好友—”);
JSONObject json = JSON.parseObject(moMoMsg.msgJson);
String userId = json.getString(MsgKeys.userId);
String friendId = json.getString(MsgKeys.friendId);
iMoMoMsg moMsg = new iMoMoMsg();
moMsg.symbol = ‘+’;
JSONObject notify = new JSONObject();
SqlModel model = new SqlModel();
if (model.addFriend(userId, friendId)) {
// 添加好友成功
notify.put(MsgKeys.msgType, iMoMoMsgTypes.ADD_FRIEND_SUCCESS);

        // 自动添加到对方好友列表中,然后发送提示信息(在线才发,不在线转离线消息)
        model.addFriend(friendId, userId);
        // 判断是否在线,在线直接转发,不在线缓存到数据库中
        // 1.得到添加好友用户的信息
        JSONObject info = model.getUserInfo(userId, false);
        iMoMoMsg addMsg = new iMoMoMsg();
        addMsg.symbol = ‘-‘;
        String headPath = info.getString(MsgKeys.userHeadPath);
        addMsg.msgBytes = FileTools.getInstance().getMultyFileBytes(
                headPath);
        info.put(MsgKeys.msgType, iMoMoMsgTypes.ADD_FRIEND);
        info.remove(MsgKeys.userHeadPath);
        // JSONObject notyadd = new JSONObject();
        // notyadd.put(MsgKeys.msgType, iMoMoMsgTypes.ADD_FRIEND);
        info.put(MsgKeys.friendId, userId);
        String friendName = model.getUserName(userId, false);
        info.put(MsgKeys.friendName, friendName);

        addMsg.msgJson = info.toJSONString();
        if (ManageClientSession.isContainsId(friendId)) {
            ManageClientSession.getSession(friendId).write(addMsg);
            System.out.println("转发成功..");
        } else {
            if (!model.isTableExists("mc_" + friendId))// "mc_" + userId
                model.createCacheTable(friendId);// 创建缓存数据库
            MsgDb msgDb = MsgTranceUtil.getInstance().Trance_Net2Db(addMsg);
            if (model.insertCacheMsg(msgDb, friendId)) {

// System.out.println(“缓存成功”);
} else {
// System.out.println(“缓存失败”);
}
}

    } else {
        notify.put(MsgKeys.msgType, iMoMoMsgTypes.ADD_FRIEND_FAILED);
    }
    moMsg.msgJson = notify.toJSONString();
    session.write(moMsg);
}

/**
 * 处理删除好友
 * 
 * @param session
 * @param moMoMsg
 */
public void handleDeleteFriend(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    String friendId = json.getString(MsgKeys.friendId);
    SqlModel model = new SqlModel();
    model.deleteFriend(userId, friendId);
    model.deleteFriend(friendId, userId);// 解除双方关系
}

/**
 * 处理获取好友Id列表
 * 
 * @param session
 * @param moMoMsg
 */
public void handleGetFriendIdList(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    SqlModel model = new SqlModel();
    String[] ids = model.getFriendIds(userId);
    String IdList = "";
    if (ids.length > 0) {
        for (String string : ids) {
            IdList += string + ",";
        }

// System.out.println(userId + “的好友列表:” + IdList);
} else {
IdList = “none”;// 无好友
// System.out.println(userId + “无好友”);
}
iMoMoMsg moMsg = new iMoMoMsg();
moMsg.symbol = ‘+’;
JSONObject jsonSend = new JSONObject();
jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.FRIEND_ID_LIST);
jsonSend.put(MsgKeys.friendIdList, IdList);
moMsg.msgJson = jsonSend.toJSONString();
session.write(moMsg);
}

/**
 * 处理用户反馈信息
 * 
 * @param moMoMsg
 */
public void handleReback(iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    String reback = json.getString(MsgKeys.msgCotent);
    FileTools.getInstance().saveReback(userId, reback);
}

/**
 * 
 * @param moMoMsg
 */
public void handleVitality(iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    int type = json.getIntValue(MsgKeys.msgType);
    String userId = json.getString(MsgKeys.userId);
    SqlModel model = new SqlModel();
    if(type == iMoMoMsgTypes.PASS_GAME){
        model.UpdateVitality(userId, -1);
    } else if(type == iMoMoMsgTypes.SIGN){
        model.UpdateVitality(userId, 1);
    }
}

/**
 * 创建多人聊天
 * 
 * @param session
 * @param moMoMsg
 */
public void handleCreateGroup(IoSession session, iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    String groupName = json.getString(MsgKeys.groupName);
    String groupTopic = json.getString(MsgKeys.groupTopic);
    String province = json.getString(MsgKeys.loc_province);
    SqlModel model = new SqlModel();

    GroupInfo gInfo = new GroupInfo();
    gInfo.creator = model.getUserName(userId, false);
    gInfo.createTime = System.currentTimeMillis();
    gInfo.groupId = "group_" + userId + "_" + gInfo.createTime;
    gInfo.groupName = groupName;
    gInfo.groupTopic = groupTopic;

    String groupIconPath = StaticValues.HEAD_P_PATH + gInfo.groupId
            + ".png";
    FileTools.getInstance().saveMultyFile(groupIconPath, moMoMsg.msgBytes);

    // 返回是否创建成功消息
    if (ManageGroups.addGroup(gInfo.groupId, gInfo)) {
        model.UpdateVitality(userId, -1);
        ManageGroups.getGroup(gInfo.groupId).joinGroup(userId);// 把创建用户添加到群组

        if(!ManageGroups.isHaveGroup){
            ManageGroups.keepWatching();//开启守护线程
        }

        iMoMoMsg moMsg = new iMoMoMsg();
        moMsg.symbol = ‘-‘;
        JSONObject jsonSend = new JSONObject();
        jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.CREATE_GROUP_SUCCESS);
        jsonSend.put(MsgKeys.groupId, gInfo.groupId);
        jsonSend.put(MsgKeys.groupName, gInfo.groupName);
        jsonSend.put(MsgKeys.groupTopic, gInfo.groupTopic);
        moMsg.msgBytes = FileTools.getInstance().getMultyFileBytes(
                groupIconPath);
        moMsg.msgJson = jsonSend.toJSONString();
        session.write(moMsg);

        if (ManageLocMap.isContainsProvince(province)) {
            // 当前省有在线用户
            ManageAProvinceLoc aProvinceLoc = ManageLocMap
                    .getAProvinceLoc(province);
            if (aProvinceLoc.getCount() > 1) {
                List<StrangerBean> list = aProvinceLoc.getDisStrangers(
                        true, userId, 0);
                if (list.size() > 0) {
                    System.out.println("周围的人 : ");
                    iMoMoMsg inviteMsg = new iMoMoMsg();
                    inviteMsg.symbol = ‘-‘;
                    JSONObject inviteJson = new JSONObject();
                    inviteJson.put(MsgKeys.msgType,
                            iMoMoMsgTypes.INVITE_TO_GROUP);
                    inviteJson.put(MsgKeys.groupCreator, gInfo.creator);
                    inviteJson.put(MsgKeys.groupId, gInfo.groupId);
                    inviteJson.put(MsgKeys.groupName, gInfo.groupName);
                    inviteJson.put(MsgKeys.groupTopic, gInfo.groupTopic);
                    inviteMsg.msgBytes = FileTools.getInstance()
                            .getMultyFileBytes(groupIconPath);
                    inviteMsg.msgJson = inviteJson.toJSONString();
                    for (StrangerBean bean : list) {
                        System.out.println("Id = " + bean.strangerId);
                        IoSession ivSession = ManageClientSession
                                .getSession(bean.strangerId);
                        ivSession.write(inviteMsg);
                    }
                }
            }
        }
    } else {
        iMoMoMsg moMsg = new iMoMoMsg();
        moMsg.symbol = ‘+‘;
        JSONObject jsonSend = new JSONObject();
        jsonSend.put(MsgKeys.msgType, iMoMoMsgTypes.CREATE_GROUP_FAILED);
        moMsg.msgJson = jsonSend.toJSONString();
        session.write(moMsg);
    }

}

/**
 * 同意加入群组
 * 
 * @param moMoMsg
 */
public void handleRecieveToGroup(iMoMoMsg moMoMsg) {
    JSONObject json = JSON.parseObject(moMoMsg.msgJson);
    String userId = json.getString(MsgKeys.userId);
    String groupId = json.getString(MsgKeys.groupId);
    GroupInfo group = ManageGroups.getGroup(groupId);
    group.joinGroup(userId);
}

/**
 * 处理发送消息(在线则转发,不在线则缓存)
 * 
 * @param session
 * @param moMoMsg
 */
public void handleChatMsg(iMoMoMsg moMoMsg) {

// System.out.println(“处理聊天消息”);
JSONObject json = JSON.parseObject(moMoMsg.msgJson);
int isGroupMsg = 0;
if (json.containsKey(MsgKeys.isGroupMsg)) {
isGroupMsg = json.getInteger(MsgKeys.isGroupMsg);
System.out.println(“isGroupMsg = ” + isGroupMsg);
}
// 判断是否是群组信息,不是则转发给单独用户
if (isGroupMsg == 0) {
String getterId = json.getString(MsgKeys.friendId);
// 判断是否在线,在线直接转发,不在线缓存到数据库中
sendMsgToUser(moMoMsg, getterId);
} else if (isGroupMsg == iMoMoMsgTypes.GROUP_MSG) {
String userId = json.getString(MsgKeys.userId);// 发送者
String groupId = json.getString(MsgKeys.friendId);// 接收好友的Id
String sendTime = json.getString(MsgKeys.sendTime);// 发送时间
System.out.println(“groupId = ” + groupId);
if (ManageGroups.isContainsGroupId(groupId)) {
Map

解密陌生人(5)处理各种消息

标签:服务器   业务逻辑   server   

原文地址:http://blog.csdn.net/u011102153/article/details/46529315

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!