[英]Emitting data to all the users in given channel - Nodejs (Socket.io)
我有一个非常简单的场景。 所有用户都是订阅者,API数据调用是发布者。 我向所有连接的用户发送相同的数据到X通道。
我知道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>
由此:
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
是在每个客户端连接中本地设置的,所以您将重复此操作,从而导致多次调用该间隔。 无需在本地进行配置,而是需要在外部进行配置,以使客户端与登录页面无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.