Socket.io 从0.9迁移

2018-10-18 17:25 更新

Socket.io 从0.9迁移


对于大多数应用程序来说,应该无缝并且没有任何问题的转换到1.0。也就是说,我们已经做了一些工作来简化一些api,并且我们已经改变了一些内部结构,因此对于大多数现有用户来说,这是一个推荐的读物。

认证的差异


Socket.io现在使用中间件

您可以通过io.use()在创建socket时运行Socket.io服务器任意函数。看看这个例子:

var srv = require('http').createServer();
var io = require('socket.io')(srv);
var run = 0;
io.use(function(socket, next){
  run++; // 0 -> 1
  next();
});
io.use(function(socket, next) {
  run++; // 1 -> 2
  next();
});
var socket = require('socket.io-client')();
socket.on('connect', function(){
  // run == 2 at this time
});

所以它的清洁工现在通过中间件进行认证

旧的io.set()io.get()方法已被弃用,仅支持向后兼容性。以下是将旧授权示例转换为中间件风格。

io.set('authorization', function (handshakeData, callback) {
  // make sure the handshake data looks good
  callback(null, true); // error first, 'authorized' boolean second 
});

vs.

io.use(function(socket, next) {
  var handshakeData = socket.request;
  // make sure the handshake data looks good as before
  // if error do this:
    // next(new Error('not authorized'));
  // else just call next
  next();
});

命名空间授权?

io.of('/namespace').use(function(socket, next) {
  var handshakeData = socket.request;
  next();
});

日志差异


现在基于调试日志记录

要打印所有调试日志记录,请将环境变量DEBUG设置为*。即:DEBUG=* node index.js

仅打印socket.io相关日志记录:DEBUG=socket.io:* node index.js

仅从socket对象打印日志记录:DEBUG=socket.io:socket node index.js

这个模式在这一点上应该是有意义的。socket.io/lib中文件的名称等同于它们的调试名称。

调试也可以在浏览器中使用; 日志会持续到本地存储。
要使用:打开开发者控制台并输入localStorage.debug = 'socket.io:*'(或任何调试级别),然后刷新页面。一切都记录下来,直到你跑localStorage.debug = ''

请参阅这里的调试文档。

快捷键


一般来说,有一些常见的新的快捷键。旧版本仍然可以工作, 但快捷方式很好。

向默认命名空间中的所有客户机广播

先前:

io.sockets.emit('eventname', 'eventdata');

现在:

io.emit('eventname', 'eventdata');

Neat.注意在这两种情况下,这些消息都会到达所有连接到默认'/'命名空间的客户端,但不能覆盖其他命名空间中的客户端。

启动服务器

先前:

var io = require('socket.io');
var socket = io.listen(80, { /* options */ });

现在:

var io = require('socket.io');
var socket = io({ /* options */ });

的配置差异


io.set已经没了

而是像这样在服务器初始化中进行配置:

var socket = require('socket.io')({
  // options go here
});

日志级之类的选项已经没了。 io.set('transports'), io.set('heartbeat interval'), io.set('heartbeat timeout', 和io.set('resource') 仍然支持向后兼容。

设置资源路径

上一个resource 选项相当于新 path选项,但需要一 / 开始。例如,以下配置

var socket = io.connect('localhost:3000', {
  'resource': 'path/to/socket.io';
});

var socket = io.connect('localhost:3000', {
  'path': '/path/to/socket.io';
});

解析器/协议的不同


这只适用于更新其他语言的socket.io实现,定制的socket.io客户端等。

差异1 - 包编码

解析现在是基于类和异步的。不用返回单个编码字符串,而是使用编码数组作为唯一的参数来编码调用回调。每个编码应按顺序写入传输。这更加灵活,使二进制数据传输工作。这里有一个例子:

var encoding = parser.encode(packet);
console.log(encoding); // fully encoded packet

vs.

var encoder = new parser.Encoder();
encoder.encode(packet, function(encodings) {
  for (var i = 0; i < encodings.length; i++) {
    console.log(encodings[i]); // encoded parts of the packet
  }
});

差异2 - 分组解码

解码使事情进一步发展,并以事件为基础。这是因为一些对象(含二进制)都被编码并在多个部分中解码。这个例子应该有帮助:

var packet = parser.decode(decoding);
console.log(packet); // formed socket.io packet to handle

vs.

var decoder = new parser.Decoder();
decoder.on('decoded', function(packet) {
  console.log(packet); // formed socket.io packet to handle
});
decoder.add(encodings[0]); // say encodings is array of two encodings received from transport
decoder.add(encodings[1]); // after adding the last element, 'decoded' is emitted from decoder


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号