2015-09-15 21 views
5

socket.io v1.3.6 (nodejs) ile çalışıyordum ve aşağıdaki kodu kullanarak tarayıcıdan veri göndermeye çalıştım.socket.io, sunucu çevrimdışıyken kullanıma yayar

Müşteri Kodu

var socket = io.connect('http://something.com:3300/'); 
 
function sendMessage(message) { 
 
\t socket.emit('message', message);  
 
}

Sunucu Kod

var io = require('socket.io').listen(3300); 
 

 
io.sockets.on('connection', function (socket) { 
 
    messageHandler(socket); 
 
}); 
 

 
function messageHandler(socket) { 
 
    socket.on('message', function (data) { \t 
 
\t console.log('Captured a message : ' + data); \t 
 
    }); 
 
}

benim soket sunucusu http://something.com:3300/ başlangıçta aşağı olduğunu ve() birkaç sendMessage aramaya çalıştım - i konsol günlüğüne el sıkışma hatası alırsınız tarayıcıda Beklendiği gibi

(yaklaşık 10 çağrıları demek).

5 dakika bekledim ve soket sunucusunu başlattım.

Ancak şaşırtıcı bir şekilde, çevrimdışı olarak gönderilen tüm iletiler, el sıkışma kurulduktan sonra sunucuda yakalanır.

Sorularım: 1) Bu çevrimdışı mantık socket.io veya WebSocket belirtiminin bir parçası mı? 2) Çok sayıda çevrimdışı mod socket.io sorusu araştırdım ve çevrimdışı mesajları yakalamak için bazı özel işlem önerileri gördüm. Ama bu özel çevrimdışı çekler olmadan nasıl çalışır?

cevap

4

Evet, ilk bağlantı öncesi yayılan edilecek paketler için bir 'çevrimdışı' tamponlama var, burada socket.js uygulanmasını bakın kendiniz:

https://github.com/socketio/socket.io-client/blob/master/lib/socket.js

(especiall onConnect kontrol etmek ve emitBuffered işlevleri/öznitelikler)

+0

Teşekkürler, açıklıyor! Bağlı olduğunda, emitBuffers'daki tüm verileri yayacaktır ... Tarayıcı açık tutulduğu sürece güvenilir yapar. – Shabeel

+0

Peki, cevabımı kabul edermisin? Yardım ettiğim için çok mutluyum :) – gabowsky

2

ben yeniden bağlanmadan bu küçük değişiklikle bu sorunu çözdü:

mySocket.on('reconnect', function() { 

    //Avoid that buffered emits getting send again 
    mySocket.sendBuffer=[]; 

    ... 
}); 

t ayarlayarak Boş bir diziyeBuffer gönderirseniz tekrar paketleri tekrar göndermekten kaçınırsınız. Tabii ki gönderme denemelerini kendi başınıza halletmelisiniz.