Javascript 向给定通道中的所有用户发送数据-Nodejs(Socket.io)
我有一个非常简单的场景。其中所有用户都是订阅者,API数据调用是发布者。我将相同的数据发送给所有连接到X通道的用户 我知道socket.io中有三个可用的函数Javascript 向给定通道中的所有用户发送数据-Nodejs(Socket.io),javascript,node.js,sockets,Javascript,Node.js,Sockets,我有一个非常简单的场景。其中所有用户都是订阅者,API数据调用是发布者。我将相同的数据发送给所有连接到X通道的用户 我知道socket.io中有三个可用的函数 socket.emit('example', data); io.sockets.emit('example', data); socket.broadcast.emit('example', data); 在我的示例中,我使用套接字在客户端推送实时数据。我面临的问题是,如果超过1个用户加入特定通道,那么数据将被发送到所有N次 我每N秒
socket.emit('example', data);
io.sockets.emit('example', data);
socket.broadcast.emit('example', data);
在我的示例中,我使用套接字在客户端推送实时数据。我面临的问题是,如果超过1个用户加入特定通道,那么数据将被发送到所有N次
我每N秒发送一次数据。如果加入了一个用户,那么一切都很好。因为x数据发送给连接的单个用户。但如果两个用户连接到同一个通道,如果我每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>
客户端代码
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>
实时应用程序
正文{字体:26px Helvetica,Arial;字体重量:粗体;}
#livez{text align:center;}
$(函数(){
var socket=io('/channel1');
socket.on('live',函数(msg){
$('#livez').text(msg);
});
});
来自此:
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
在每个客户端连接中都是本地设置的,因此您将重复该设置,从而导致多次调用该间隔。您需要将其设置为在外部配置,以便对登录到页面的客户端不可知。当前功能源于“on connection”回调中存在的setInterval。在每个连接上,您现在都告诉该实例从初始实例化开始每隔10秒执行一次函数测试。@AaronF我明白您的意思了。在每个新连接上,我都执行http请求。因此,10个用户意味着X秒内有10个http请求。那么我如何发出http请求呢?并且只发送一次?您需要在连接的客户端的内部范围之外创建setinterval。正确。如果你想把它移出连接块,你想在每个emit上发送什么样的信息?@AaronF它的股票价格。我把它放出来了,它解决了这个问题。