![](/img/trans.png)
[英]why does socket.io client emit trigger its own listener…even if server is offline?
[英]socket.io emit when server is offline
我正在使用socket.io v1.3.6(nodejs)並嘗試使用以下代碼從瀏覽器發出數據。
客戶代碼
var socket = io.connect('http://something.com:3300/'); function sendMessage(message) { socket.emit('message', message); }
服務器代碼
var io = require('socket.io').listen(3300); io.sockets.on('connection', function (socket) { messageHandler(socket); }); function messageHandler(socket) { socket.on('message', function (data) { console.log('Captured a message : ' + data); }); }
我的套接字服務器http://something.com:3300/最初是關閉的,並嘗試調用少量sendMessage() - (比如大約10個調用)
正如預期在瀏覽器中我將在控制台日志中獲得握手錯誤。
我等了5分鍾,啟動了socket服務器。
但令人驚訝的是,一旦握手建立,在離線期間發送的所有消息都將在服務器中捕獲。
我的問題:1)這個脫機邏輯是socket.io或WebSocket規范的一部分嗎? 2)我搜索了很多離線模式socket.io問題,並看到了一些特殊處理建議來捕獲離線消息。 但是如果沒有那些特殊的離線檢查,這怎么工
是的,在第一次連接之前有一個'離線'緩沖包,在這里看一下socket.js的實現:
https://github.com/socketio/socket.io-client/blob/master/lib/socket.js
(特別檢查onconnect和emitBuffered函數/屬性)
我通過重新連接時的這個小改動解決了這個問題:
mySocket.on('reconnect', function() {
//Avoid that buffered emits getting send again
mySocket.sendBuffer=[];
...
});
通過將sendBuffer設置為空數組,可以避免在重新連接時再次發送包。 當然,您應該自己處理發送嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.