我有一個非常簡單的場景。所有用戶都是訂閱者並且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>
當前的功能來自'連接'回調中存在的setInterval。在每個連接上,您現在告訴該實例從初始實例化開始每隔10秒執行一次函數測試。 – Shadowfool
@AaronF我明白你的意思了。在每個新連接上,我正在執行http請求。所以10個用戶在X秒內意味着10個http請求。那麼我如何提出http請求呢?並只發送一次? –
您需要在連接的客戶端的內部範圍之外創建setinterval。 –