一,前端发送协议
在建立长连接后,我们发送的第一条协议称之为“enter”,用来建立用户ID和长连接的对应关系。socket协议依旧使用JSON进行传递。
1,协议结构的设计
每条协议由两部分组成
- 操作
- 和操作相关的数据
如下:
{
"opr" : "oprname",
"data" : {}
}
2,bind协议的定义
为了方便前端协议定义的管理,我们把所有前端相关的协议定义统一放置到一个文件中:
net/protocol/protocolData.js
在此输入以下代码:
var protocolData = {};
var userData = require('userData');
protocolData.enter = function() {
return {
'opr' : 'enter',
'data' : {
'userId' : userData.userId,
'token' : userData.token
}
}
}
module.exports = protocolData;
3,前端发送enter协议
前端何时发送enter协议呢?在socket连接后,即发送此协议。
在socket.js引入协议的定义:
var protocolData = require('protocolData');
输入以下函数:
_onOpne: function() {
// 发送绑定协议
this.send(protocolData.enter());
},
在建立socket建立时即调用此函数:
ws.onopen = function (event) {
console.log('ws test 000 Send Text WS was opened.');
self._onOpne();
};
二,后端的处理
1,消息处理入口总览
在router.js中定义socket消息的处理入口:
router.onSocketMsg = function(initData, conn) {
}
在socket状态监听中调用消息处理入口:
conn.on('text', function (data) {
router.onSocketMsg(data, conn);
})
2,消息分发
socket消息的分发实现和HTTP的分发采用同样的映射方案,定义消息处理变量:
var socketHander = {};
实现enter操作的实现:
socketHander.enter = function(data, conn) {
// DO NOTHING
}
3,消息处理入口的实现
在onSocketMsg函数中,我们需要先检测协议中携带的token数据是否正确,正确才能继续处理,否则返回给用户token错误信息。
router.onSocketMsg = function(initData, conn) {
var data = null;
try{
data = JSON.parse(initData);
}catch(e) {
console.log('parse json error , ', e);
conn.sendText('parse data error');
return;
}
// 检测token
user.checkToken(data['data']['userId'], data['data']['token'], function(res) {
console.log('checkToken come in res = ' + res);
if(!res) {
var resdata = {
'opr':data['opr'],
'data' : {
'error': 1,
'info' : 'token is error!!'
}
}
conn.sendText(JSON.stringify(resdata));
return;
}
// 进行分发
socketHander[data['opr']](data['data'], conn)
});
}
上一篇 实现Socket通信
下一篇 用户长连接管理
网友评论