2017-06-12 37 views
0

我有一個非常簡單的場景。所有用戶都是訂閱者並且API數據調用是發佈者。我將相同的數據發送給所有連接的用戶到X頻道。向給定通道中的所有用戶發送數據 - Nodejs(Socket.io)

我所知道的三個功能可在socket.io

socket.emit('example', data); 
io.sockets.emit('example', data); 
socket.broadcast.emit('example', data); 

在我的例子中,我使用套接字來推動客戶端的實時數據,我所面臨的問題是,如果有更多的超過1個用戶加入特定頻道,則數據全部發送N次。

我每N秒發送一些數據。如果1個用戶加入,那麼一切都很好。因爲x數據被髮送給連接的單個用戶。但是如果2個用戶連接到相同的頻道,並且如果我每10秒發送x個數據,則我看到發送速度減半,即每發送5秒數據。如果我打開10個選項卡(意味着連接了10個用戶),並且每10秒向所有連接的用戶發送數據。我看到數據每1秒發送給所有用戶。

因爲我的應用程序正在向API推送實時數據給所有用戶,而不是將一個用戶的消息發送給所有其他連接的用戶。我想我需要不同的方法。也就是說,我不希望任何用戶收聽任何其他用戶,只是收到每個人都收到的相同數據。

我該如何做到這一點?

下面是我的代碼

服務器端代碼

var app = require('express')(); 
var http = require('http').Server(app); 
var httpk = require('http'); 
var io = require('socket.io')(http); 
var nsp = io.of('/channel1'); 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

nsp.on('connection', function(socket){ 

    nsp.emit('live', 'Welcome User!'); 

    function test() 
    { 
    httpk.get("api-to-url", function(res) { 
     var body = ''; 
     res.on('data', function(data){ 
      body += data; 
     }); 
     res.on('end', function() { 
      var parsed = JSON.parse(body); 
      console.log(parsed.johndoe.bid_price); 
      nsp.emit('live', parsed.johndoe.bid_price); 
     }); 
    }); 
    } 

    setInterval(test,10000); 

    socket.on('disconnect', function(){ 
    console.log('1 user disconnected'); 
    }); 

}); 

http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

客戶端代碼

<!doctype html> 
<html> 
    <head> 
    <title>Live App</title> 
    <style> 
     body { font: 26px Helvetica, Arial; font-weight:bold;} 

     #livez { text-align: center;} 
    </style> 
    </head> 
    <body> 
    <p id="livez"></p> 


    <script src="/socket.io/socket.io.js"></script> 
<script src="https://code.jquery.com/jquery-1.11.1.js"></script> 

<script> 
    $(function() { 
    var socket = io('/channel1'); 

    socket.on('live', function(msg){ 
    $('#livez').text(msg); 
    }); 
    }); 

</script> 
    </body> 
</html> 
+1

當前的功能來自'連接'回調中存在的setInterval。在每個連接上,您現在告訴該實例從初始實例化開始每隔10秒執行一次函數測試。 – Shadowfool

+0

@AaronF我明白你的意思了。在每個新連接上,我正在執行http請求。所以10個用戶在X秒內意味着10個http請求。那麼我如何提出http請求呢?並只發送一次? –

+0

您需要在連接的客戶端的內部範圍之外創建setinterval。 –

回答

1

從這:

nsp.on('connection', function(socket){ 

    nsp.emit('live', 'Welcome User!'); 

    function test() 
    { 
    httpk.get("api-to-url", function(res) { 
     var body = ''; 
     res.on('data', function(data){ 
      body += data; 
     }); 
     res.on('end', function() { 
      var parsed = JSON.parse(body); 
      console.log(parsed.johndoe.bid_price); 
      nsp.emit('live', parsed.johndoe.bid_price); 
     }); 
    }); 
    } 

    setInterval(test,10000); 

    socket.on('disconnect', function(){ 
    console.log('1 user disconnected'); 
    }); 

}); 

http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

這樣:

function test() 
    { 
    httpk.get("api-to-url", function(res) { 
     var body = ''; 
     res.on('data', function(data){ 
      body += data; 
     }); 
     res.on('end', function() { 
      var parsed = JSON.parse(body); 
      console.log(parsed.johndoe.bid_price); 
      nsp.emit('live', parsed.johndoe.bid_price); 
     }); 
    }); 
    } 



setInterval(test,10000); 

nsp.on('connection', function(socket){ 

    nsp.emit('live', 'Welcome User!'); 

    socket.on('disconnect', function(){ 
    console.log('1 user disconnected'); 
    }); 

}); 

因爲你setInterval本地每個客戶端連接內設置你會複製這導致間隔被多次調用。您不需要在本地進行配置,而是需要將其配置到外部,以便客戶端登錄到頁面上時不受限制。

相關問題