解密陌生人(4)--客户端和服务器间消息包构造

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

因为要发送自己定义的消息包,所以需要设计客户端与服务器之间传递的消息的具体构造。

package com.imomo_msg;

/**

* symbol = ‘+’ : 纯本文件

* symbol = ‘-’ : 非纯本文件

* @author Administrator

*/

public class iMoMoMsg {

/* symbol = ‘+’ : 纯本文件 symbol = ‘-’ : 非纯本文件 /

public char symbol;// 判断是否是纯文本文件

/* 包含非文本信息详情的解释 /

public String msgJson;

/* 非文本信息 /

public byte[] msgBytes;

@Override

public String toString() {

return “iMoMoMsg [symbol=” + symbol + “, msgJson=” + msgJson + “]”;

}

}

这个就是所有通讯的消息包结构,symbol主要是被编解码器识别,然后根据是发送文本还是非文本消息进行不同的编解码。msgJson 是所有文本消息的JSON字符串。如果是文本消息,msgBytes = null. 如果是非文本消息,msgBytes 就是非文本消息的字节数组,如语音或图片。msgJson 这时不为空,它包含该语音或图片的解释,如是谁发送的,例如注册消息,这里要包含用户的id等信息。

对于文本消息,这里发送JSON字符串,因为JSON比较好处理,调用阿里的开源项目fastjson,处理起来就和Hashmap差不多,非常方便。需要注意的是,json 字符串中必须要包含消息类型键值对,这里便要根据实际需求设计消息类型了。如下:

package com.imomo_msg;

public interface iMoMoMsgTypes {

int REGISTER = 0;// 注册

int REGISTER_SUCCESS = 1;// 注册成功

int REGISTER_FAILED = 2;// 注册失败

int LOGIN = 3;// 登录

int LOGIN_SUCCESS = 4;// 登录成功

int LOGIN_FAILED = 5;// 登录失败

int LOGIN_SUPER_HEAD = 6;// 超级登录,用户手机有用户图像,无需获取头像

int LOGIN_SUPER_NOHEAD = 7;// 超级登录,用户手机无用户图像,需要从服务器获取头像等信息

int LOGIN_SUPER_SUCCESS = 8;// 成功

int LOGIN_SUPER_FAILED = 9;// 失败

int LOGOUT = 10;// 用户下线

int FIND_PASSWD = 11;// 找回密码

int FIND_PASSWD_SUCCESS = 12;// 已发送找回密码邮件

int FIND_PASSWD_FAILED = 13;// 找回密码失败

int RESET_PASSWD = 14;// 重置密码

int RESET_PASSWD_SUCCESS = 15;// 重置密码成功

int RESET_PASSWD_FAILED = 16;// 重置密码失败

int RESET_USERNAME = 17;// 修改用户名

// int RESET_USERNAME_SUCCESS = 18;// 修改用户名成功

// int RESET_USERNAME_FAILED = 19;// 修改用户名失败

int RESET_SEX = 200;// 修改性别

int RESET_BIRTHDAY = 201;// 修改生日

int RESET_SIGNATUE = 202;// 修改个人签名

int RESET_HEAD = 20;// 修改头像

int RESET_HEAD_SUCCESS = 21;// 修改头像成功

int RESET_HEAD_FAILED = 22;// 修改头像失败

int CHATING_TEXT_MSG = 23;// 聊天信息-文本信息

int CHATING_VOICE_MSG = 24;// 聊天信息-语音信息

int CHATING_IMAGE_MSG = 25;// 聊天信息-图片信息

int CONNECT_DOWN = 26;// 和服务器的连接断开

int LOCATION = 27;// 用户的地理位置

int GET_STRANGERS_LOC_ONEKM = 28;// 请求得到周围一公里陌生人地理位置

int GET_STRANGERS_LOC_MORE = 40; // 大于一公里的人

int STRANGERS_LIST_ONEKM = 31;// 一公里内陌生人列表

int STRANGERS_LIST_MORE = 38;// 更多附近的人

int NO_STRANGERS = 32;// 周围无陌生人

int GET_STRANGER_INFO = 50;// 获取陌生人个人信息

int ADD_FRIEND = 33;// 添加好友

int ADD_FRIEND_SUCCESS = 36;// 添加成功

int ADD_FRIEND_FAILED = 37;// 添加成功

int DELETE_FRIEND = 35;// 删除好友

int GET_FRIEND_ID_LIST = 34;// 获得好友Id列表

int FRIEND_ID_LIST = 42;// 好友Id列表

int GETA_FRIEND_INFO_HEAD = 29;// 得到一个陌生人的具体信息(本地有图像,服务器不用发送头像)

int GETA_FRIEND_INFO_NOHEAD = 30;// 得到一个陌生人的具体信息(本地无图像,服务器要发头像)

int REBACK = 51;//用户反馈

int GROUP_INVITE = 52;//群聊天邀请

int SIGN = 55;//每日签到

int CREATE_GROUP = 56;//创建群组

int CREATE_GROUP_SUCCESS = 57;

int CREATE_GROUP_FAILED = 58;

int INVITE_TO_GROUP = 59;//邀请加入多人聊天

int AGREEE_TO_GROUP = 60;//同意加入群组

int GROUP_MSG = 61;

int PASS_GAME = 62;//活力值通关

}

还需要设计的是需要发送哪些消息,也就是JSON的键

package com.imomo_msg;

/**

* JSON数据的键

*

* @author Administrator

*

*/

public interface MsgKeys {

String msgType = “msgType”;// 消息类型

String userId = “userId”;// 发送者Id

String friendId = “friendId”;// 接收者Id

String friendName = “friendName”;//好友名

String sendTime = “sendTime”;// 发送时间

String msgCotent = “msgCotent”;// 聊天信息-文本信息

String voiceTime = “voiceTime”;// 聊天信息-语音信息长度

String voicePath = “voicePath”;// 聊天信息-语音文件路径

String imagePath = “imagePath”;// 聊天信息-图片路径

String userEmail = “userEmail”;// 用户注册邮箱,登录时用邮箱登录

String userName = “userName”;// 用户名

String userSex = “userSex”;// 用户性别

String userBirthday = “userBirthday”;// 用户生日

String userPasswd = “userPasswd”;// 登录密码

String personSignature = “personSignature”;// 个性签名

String vitalityValue = “vitalityValue”;//活力值

String userHeadPath = “userHeadPath”;// 用户头像路径

String loc_province = “loc_province”;// 所处省份

String loc_Longitude = “loc_Longitude”;// 经度

String loc_Latitude = “loc_Latitude”;// 纬度

String distRange = “distRange”;//多少公里之内的

String strangerList = “strangerList”;//陌生人列表

String friendIdList = “friendIdList”;//好友Id列表

String groupId = “groupId”;//群组Id

String groupName = “groupName”;//群组名

String groupTopic = “groupTopic”;//群组主题

String groupCreator = “groupCreator”;//

String isGroupMsg = “isGroupMsg”;

}

然后就可以构造一条消息了:

//测试注册

iMoMoMsg moMoMsg = new iMoMoMsg();

JSONObject Json = new JSONObject();

Json.put(MsgKeys.msgType, iMoMoMsgTypes.REGISTER);

Json.put(MsgKeys.userEmail, “157*****@163.com”);

Json.put(MsgKeys.userName, “isRunning”);

Json.put(MsgKeys.userPasswd, “run_run”);

Json.put(MsgKeys.userBirthday, “**“);

Json.put(MsgKeys.userSex, “male”);

moMoMsg.msgJson = Json.toJSONString();

moMoMsg.msgBytes = FileTools.getInstance().getMultyFileBytes(“E:\iMoMoServer\ClientsHead\fff.png”);

moMoMsg.symbol = ‘-‘;

这就是一条非文本消息的构造,文本消息没有字节数组即可。

时间: 2024-10-10 05:55:30

解密陌生人(4)--客户端和服务器间消息包构造的相关文章

C# Socket基础(四)之客户端向服务器发消息

private Socket socketClient;//客户端套接字,关于实例化请参考C# Socket基础(三)之客户端连接服务器和接收消息 客户端发送消息 1 /// <summary> 2 /// 发送数据到服务端 3 /// </summary> 4 private void Send() 5 { 6 if (socketClient == null) 7 { 8 9 ShowMsg("服务器未启动!"); 10 return; 11 } 12 by

C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)

如果对Windows API不太熟悉.对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的.以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解.学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻.更遗憾的是,以前学C的时候,误以为自己把C学会了,误以为C就那么几个头文件而已,就一个黑框子而已. 现在,经过一段时间的痛苦磨练,又有了一些新的认

加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证

加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证 各角色比喻 客户端:通常为请求方,要验证服务器的身份. 服务器:通常为响应方,有时也要验证客户端的身份. C     A :全拼为Certificate Authority,就是第三方验证机构.客户端与服务器只有在CA申请了证书之后才能证明身份合法. 加   密 :客户端或服务器把数据放在箱子里,然后用钥匙(公钥或私钥)将箱子锁上,再放到网络上传输,只有有用钥匙的人才能打开箱子. 根

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

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我. 原工程:https://github.com/LineChen/ (4)已经说了怎么构造一条消息.这篇要说的就是处理各种业务逻辑的具体. package com.imomo_server; import java.io.FileOutputStream; import java.nio.channels.FileChannel; import java.util.Date; import

【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信

利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩:这个类只用于派生,所以不会生成这个类的实例:可以考虑使用TCPServer和UDPServer.TCPServer/UDPServer:基本的网络同步TCP/UDP服务器.UnixStreamServer/ UnixDatagramServer:基本的基于文件同步TCP/UDP服务器.Fork

解密陌生人(3)服务器整体架构简要

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我. 之前把概要设计说了一下.现在就进入详细设计与实现了.这篇先说服务器的.服务器就是处理客户端发来的各种请求的,比如注册.找回密码.添加好友等等.当然这些请求都是自己按实际需要认为设计的. 先将服务器的整体构架,由于用的是集成好的框架mina,所以不需要自己去考虑太多具体细节,如异步处理,如何实现高并发.如果用传统的socket当然也可以实现,但是高并发的要求很难达到.之前已经发了一篇关于mi

Java实验四 TCP客户端和服务器的应用

实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 4.对通信内容进行摘要计算并验证 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B的公钥 B解密时,用B的私钥 发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递.同时用hash函数将明文进行用作验证.    接收方B接收到信息后,用RSA解密DES密钥信息,再用RSA解密获取到的密钥信息解密密文信息,最终就可以得到我们要的信息(明文)

聊天服务器-解密陌生人(9)聊天消息转发

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请@我. 原工程:https://github.com/LineChen/ 五.转发信息 因为客户端和服务器是保持长连接的,所以可以根据用户Id得到用户的会话session,得到session就可以发送消息. 对于聊天,主要分聊天双方都在线和一方离线的情况.都在线的情况好办,直接转发:一方离线时,需要在数据库中保存离线消息,等到离线好友登录时会发送给ta.保存离线消息需要注意的是,要根据消息类型做相应的

多人在线游戏,客户端服务器间同步低延迟方案(译)

原文:https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking 输入预测 假设玩家的网络延迟为150毫秒,并开始向前移动.该按键命令发送到服务器.用户命令被处理,并且玩家的角色在游戏世界中向前移动.这个状态更改将通过下一次快照更新传输到所有客户端.所以玩家在开始走路之后,会在150毫秒的延迟时间后看到自己的动作变化.这种延迟存在于所有玩家的行动,如运动,射击武器等,并且随着更高的延迟而变得更糟.玩家输入和相应的视