Socket.io 從0.9遷移

2018-10-18 17:25 更新

Socket.io 從0.9遷移


對于大多數(shù)應(yīng)用程序來說,應(yīng)該無縫并且沒有任何問題的轉(zhuǎn)換到1.0。也就是說,我們已經(jīng)做了一些工作來簡化一些api,并且我們已經(jīng)改變了一些內(nèi)部結(jié)構(gòu),因此對于大多數(shù)現(xiàn)有用戶來說,這是一個推薦的讀物。

認(rèn)證的差異


Socket.io現(xiàn)在使用中間件

您可以通過io.use()在創(chuàng)建socket時運行Socket.io服務(wù)器任意函數(shù)。看看這個例子:

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
});

所以它的清潔工現(xiàn)在通過中間件進(jìn)行認(rèn)證

舊的io.set()io.get()方法已被棄用,僅支持向后兼容性。以下是將舊授權(quán)示例轉(zhuǎn)換為中間件風(fēng)格。

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();
});

命名空間授權(quán)?

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

日志差異


現(xiàn)在基于調(diào)試日志記錄

要打印所有調(diào)試日志記錄,請將環(huán)境變量DEBUG設(shè)置為*。即:DEBUG=* node index.js

僅打印socket.io相關(guān)日志記錄:DEBUG=socket.io:* node index.js。

僅從socket對象打印日志記錄:DEBUG=socket.io:socket node index.js。

這個模式在這一點上應(yīng)該是有意義的。socket.io/lib中文件的名稱等同于它們的調(diào)試名稱。

調(diào)試也可以在瀏覽器中使用; 日志會持續(xù)到本地存儲。
要使用:打開開發(fā)者控制臺并輸入localStorage.debug = 'socket.io:*'(或任何調(diào)試級別),然后刷新頁面。一切都記錄下來,直到你跑localStorage.debug = ''

請參閱這里的調(diào)試文檔。

快捷鍵


一般來說,有一些常見的新的快捷鍵。舊版本仍然可以工作, 但快捷方式很好。

向默認(rèn)命名空間中的所有客戶機(jī)廣播

先前:

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

現(xiàn)在:

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

Neat.注意在這兩種情況下,這些消息都會到達(dá)所有連接到默認(rèn)'/'命名空間的客戶端,但不能覆蓋其他命名空間中的客戶端。

啟動服務(wù)器

先前:

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

現(xiàn)在:

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

的配置差異


io.set已經(jīng)沒了

而是像這樣在服務(wù)器初始化中進(jìn)行配置:

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

日志級之類的選項已經(jīng)沒了。 io.set('transports'), io.set('heartbeat interval'), io.set('heartbeat timeout', 和io.set('resource') 仍然支持向后兼容。

設(shè)置資源路徑

上一個resource 選項相當(dāng)于新 path選項,但需要一 / 開始。例如,以下配置

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

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

解析器/協(xié)議的不同


這只適用于更新其他語言的socket.io實現(xiàn),定制的socket.io客戶端等。

差異1 - 包編碼

解析現(xiàn)在是基于類和異步的。不用返回單個編碼字符串,而是使用編碼數(shù)組作為唯一的參數(shù)來編碼調(diào)用回調(diào)。每個編碼應(yīng)按順序?qū)懭雮鬏?。這更加靈活,使二進(jìn)制數(shù)據(jù)傳輸工作。這里有一個例子:

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 - 分組解碼

解碼使事情進(jìn)一步發(fā)展,并以事件為基礎(chǔ)。這是因為一些對象(含二進(jìn)制)都被編碼并在多個部分中解碼。這個例子應(yīng)該有幫助:

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號