协议,一种简单协议,我把他叫做双字节协议,用处:聊天通信中 所有协议,二进制或者文本的,各自有各自的好处,但大多纷繁复杂,能不能精简到足够简单,容易解析呢?在很多系统中使用json或者xml是挺好的,足够结构化,但不简洁,有时系统中需要引入额外的库,如何做到不引入自己非常容易解析,以下使用双字节协议简化协议。结尾借鉴http协议,使用\r\n,实际上,如果使用websocket协议,是不需要任何\r\n等协议标识结尾的,websocket协议里面可以去除结尾。
1 c1 ------> cmd first step如websocket发送登录 c1, 为鉴权 命令
c1:abcdef\npassword\nroomid\r\n 服务端截取前两个字节 abcdef 为用户名 password 为密码 roomid为房间id号
2 r1 -------> ret first step返回 动态口令给用户,用户端可以开启传输流
r1:adadfdadfdadf(8090\r\n* 服务端返回 r1 对应 c1 adadfdadfdadf*(8090 为认证sessionID r1:192.168.1.1\np3002\r\n 返回媒体服务器ip,port [多个服务器返回其中一个最快的,负载均衡] 返回备份媒体服务器ip,port
3 cc ------> cmd content 内容发送发送内容如websocket发送 cc:SDKDKKDLKDKKD*(((*889090\r\n cc:pic::后面为图片内容 cc:vid->78::h264等数据 78字节 cc:aud->24::aac等数据24字节
4 ct---------> cmd chat 聊天如websocket发送 c3:这是聊天内容
c3:user1::这里是聊天内容 user1是单独某一个人 c3:user1:user2:user3::this is chat content1\nthis is chat content2\r\n 三个人
5 cmd ca: cmd chat allca::这里是聊天内容\r\n ca:room1::这里是聊天内容\r\n room1为某一个房间
6 c4-------> 一对一链接一对一 链接某个人 c4:a->b\r\n
r4回复
该协议内容会逐渐补充,
示例代码 nodejs /*
author:qianbo
418511899@qq.com
*/
const WebSocket = require('ws');
const http = require('http');
const server = http.createServer();
const url = require('url');
//const HashMap = require('hashmap');
//房间的集合
let rooms = new Map();
const ws_server = new WebSocket.Server({ server });
//创建rooms
function noop() { }
server.on('upgrade', function upgrade(request, socket, head) {
// const pathname = url.parse(request.url).pathname;
// console.log(pathname);
});
function send_string(self, data, ws) {
// self_include (0 or 1) 0:转发,不需要发送自己,1:群发,包括自己
let rn = ws._room_name;
if (rn != null && rooms.has(rn)) {
let room = rooms.get(rn);
room.forEach(function (_ws) {
//给每个人发送
if (_ws.readyState === WebSocket.OPEN) {
//不用给自己发送
//if (self_include == 1) // 需要发送给自己
// _ws.send(JSON.stringify(jdata));
//else // 不需要发送给自己
if (_ws !== ws) // 发送给房间内其他人
_ws.send(data);
}
});
}
}
function add_member(ws) {
let room = rooms.get(ws._room_name);
let id = ws._name;
console.log("add_member:",id);
if (room != null) {
for (var key of room.keys()) {
console.log(key);
}
if (room.has(id)) { //存在该ID
let oldws = room.get(id);
oldws.terminate();
//room_map.delete(id);
room.set(id, ws);
}
else { //not exist this ID
room.set(id, ws);
}
}
}
function send_member(ws) {
// 获取房间路由(房间号)
let rn = ws._room_name;
let name = ws._name;
if (rn != null && rooms.has(rn)) {
let room = rooms.get(rn);
let group = "l2:"; //login cmd
//room.forEach(function(_ws,name)
let gnum = 0;
room.forEach(function (_ws) {
//给每个人发送
if (_ws !== ws && _ws.readyState === WebSocket.OPEN) {
console.log("now is ", gnum);
gnum++;
group += _ws._name;
group += "\n";
_ws.send("l2:" + name); //login
// _ws.send(JSON.stringify(ws.logininfo));
}
});
if(gnum >0)
ws.send(group);
//let l = { type: 'login', body: { list: logininfos } };
//ws.send(JSON.stringify(l));
}
}
function send_login_out(ws) {
if (ws._name == null)//not login so do nothing
return;
let rn = ws._room_name;
if (rn != null && rooms.has(rn)) {
let room = rooms.get(rn);
let data = "l2:" + ws._name; //login
console.log("send_login_out:", data);
if(room != null){
room.forEach(function (_ws) {
//not send to self
if (_ws !== ws && _ws.readyState === WebSocket.OPEN) {
_ws.send(data);
//_ws.send(JSON.stringify(jdata));
}
});
room.delete(ws._name);
}
}
}
ws_server.on('connection', function connection(ws, req, client) {
ws.isAlive = true;
// const route_name = url.parse(ws.upgradeReq.url).pathname;
// 获取房间路由(房间号) pathname 是房间号
let rn = url.parse(req.url).pathname;
if(rn.length >1){
if(rn[0] == '/')
rn = rn.substring(1);
}
ws._room_name = rn;
console.log("room_name", ws._room_name);
//var room = null;
if (!rooms.has(ws._room_name)) { //存在该房间
//rooms.get(ws.route_name).add(ws);
console.log("connection add ",ws._room_name)
let room = new Map();
rooms.set(ws._room_name, room);
}
ws.on('pong', function () {
this.isAlive = true;
//console.log("pong");
});
ws.on('message', function incoming(data) {
if (data.length
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?