您当前的位置: 首页 > 

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

协议:双字节协议

qianbo_insist 发布时间:2021-03-11 20:11:47 ,浏览量:0

协议,一种简单协议,我把他叫做双字节协议,用处:聊天通信中 所有协议,二进制或者文本的,各自有各自的好处,但大多纷繁复杂,能不能精简到足够简单,容易解析呢?在很多系统中使用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 all

ca::这里是聊天内容\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             
关注
打赏
1663161521
查看更多评论
0.0379s