socket.io 协议相关

.net版Socketio4net类库和java版socket.io-java-client类库 连接socket.io 1.4版本都不行,网上大多是socket.io 0.9版本的,socket.io 更新之后就不支持了。本人已研究

成功连接socket.io 1.4版本的方法,例子采用C#。

  一、socket.io 几个重要要文件

   1、node_modules\socket.io\node_modules\engine.io\node_modules\engine.io-parser\lib\index.js  

复制代码
var packets = exports.packets = {
    open:     0    // non-ws
  , close:    1    // non-ws
  , ping:     2
  , pong:     3
  , message:  4
  , upgrade:  5
  , noop:     6
};
复制代码

    这几个是定义消息类型的 websocket连接的时候在open事件里需要发送一个send("5[\"simple\",{\"name\":\"simple\"}]"); 类型为5的消息。

    

复制代码
exports.decodePacket = function (data, binaryType, utf8decode) {
  // String data
   console.log('解析数据'+data);
  if (typeof data == 'string' || data === undefined) {
    if (data.charAt(0) == 'b') {
      return exports.decodeBase64Packet(data.substr(1), binaryType);
    }

    var type = data.charAt(0);
     
    if (utf8decode) {
      try {
        data = utf8.decode(data);
      } catch (e) {
        return err;
      }
    }
    console.log('解析数据3:'+type);
    if (Number(type) != type || !packetslist[type]) {
      return err;
    }

    if (data.length > 1) {
      return { type: packetslist[type], data: data.substring(1) };
    } else {
      return { type: packetslist[type] };
    }
  }

  // Binary data
  if (binaryType === 'arraybuffer') {
    var type = data[0];
    var intArray = new Uint8Array(data.length - 1);
    for (var i = 1; i < data.length; i++) {
      intArray[i - 1] = data[i];
    }
    return { type: packetslist[type], data: intArray.buffer };
  }
  var type = data[0];
  return { type: packetslist[type], data: data.slice(1) };
};
复制代码

   从客户端发过来的消息会从这里解析出来,得到消息类型。

   2、node_modules\socket.io\node_modules\engine.io\lib\socket.js

     从上面解析出来的消息字符串会到这里

View Code

 

   3、node_modules\socket.io\node_modules\socket.io-parser\index.js

View Code
View Code

    然后消息会传递到这里,再解析它。

     4、node_modules\socket.io\node_modules\socket.io-parser\node_modules\component-emitter\index.js

    最后消息会到这里找到对应的回调函数。

View Code

   二、socket.io授权

    1、.net授权获取sid

       授权地址http://127.0.0.1:3000/socket.io/?eio=3&transport=polling&t=1404421022936,0.9版本的socket.io授权不一样,通过这个授权地址返回

         sessionid,如下格式 0{"sid":"BrB2vsiK79ZoLdMcAAAK","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":60000},解析得到sid.

View Code

      以下是socket.io接收到的授权消息,能够取到客户端传来的cookie,可以用过控制重复登录。

View Code

  三、websocket 连接

     websocket连接地址ws://127.0.0.1:3000/socket.io/?eio=3&t=124324324324&transport=websocket&sid=" + this.HandShake.SID,这个很重要

View Code

    连接之后在open 事件里需要发送一个类型为5(upgrade 心跳)的消息websocket.send("5[\"simple\",{\"name\":\"simple\"}]");,然后websocket会收到一个“40”消息,

   40代表连接功能了,可以进行通信了。

 

  一般发送消息的格式为:"42[\"simple\",{\"name\":\"tstssss\"}]"

  42:代表消息类型,simple为socket.io的事件名称。

 

  四、定时发送心跳数据

      授权的时候能获取到"pingInterval":25000,"pingTimeout":60000 心跳间隔和超时的时间,需要每隔 pingInterval 时间 发送一次心跳数据才能保存不断开连接。

    send("5:::");

 

  五、带回调函数的方法

    服务器回调:

    socket.io 服务器端给客户端发送数据带回调函数如下:

  socket.emit('newuser','newuser-data',function(m,d){
        console.log(m);
        console.log(d);
    });

   客户端接收到的数据形式如下: 420["newuser","newuser-data"] 或 4290203["newuser","newuser-data"]

   其中4代表:message,2代表:event ,0 ,90203 代表:回调函数的事件ID号,事件ID号是不固定的

   如果客户端收到消息,服务器需要触发回调函数时:

   this.send("430[\"newuser\",{\"name\":\"simple\"}]");

   this.send("4390203[\"newuser\",{\"name\":\"simple\"}]");

   其中 3代表:ack 回调, “newuser”必须和原有名字一致。

 

    客户端回调:

  

    socket.on('messageAck', function (data,fn) {
        console.log(data);
        //console.log(fn);
        fn('aaa','bb','cc',{id:1});
    });

 

 

 

   客户端发送 this.send("423[\"messageAck\",\"ssssssssssssssssss\"]"); ,3 代表消息ID

服务器收到信息之后 回立马发送  “433["messageAck",.........]” 到客户端

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值