Socket.io 没有流式传输到多个连接

Posted

技术标签:

【中文标题】Socket.io 没有流式传输到多个连接【英文标题】:Socket.io not streaming to multiple connections 【发布时间】:2012-10-31 12:04:52 【问题描述】:

我正在尝试将推文流式传输到客户端并且一切正常,只要只有一个连接。如果我在浏览器的一个选项卡中流式传输推文并在新选项卡中打开页面,第一个选项卡将停止接收新推文,只有第二个选项卡会接收它们。

服务器代码。

io.sockets.on('connection', function (socket) 

  var twitter = require('ntwitter'),
  util = require('util'),
  twit = new twitter(
    consumer_key: '',
    consumer_secret: '',
    access_token_key: '',
    access_token_secret: ''
  );

 twit.stream('statuses/filter', 'locations':'-124.46, 24.31, -66.57, 49.23', 
    function(stream) 
       stream.on('data', function (data) 
         data.geo  ? socket.emit('twitter', data) : ''
    );
 );

客户端代码:

var socket = io.connect()

socket.on('twitter', function (data) 

    //Do really awesome things.

);

我做错了什么?它必须很简单。我无法想象支持多个连接有这么难。

干杯

【问题讨论】:

除非您希望每个用户流式传输不同的推文,否则最好不要在连接处理程序中执行此操作,而是一劳永逸地设置它并执行io.sockets.emit - 这应该将消息发送到所有当前连接的套接字。在连接处理程序中,您通常会设置每个套接字唯一的内容。 【参考方案1】:

尝试将socket.emit 更改为sockets.emit

io.sockets.on('connection', function (socket) 

  var twitter = require('ntwitter'),
  util = require('util'),
  twit = new twitter(
    consumer_key: '',
    consumer_secret: '',
    access_token_key: '',
    access_token_secret: ''
  );

 twit.stream('statuses/filter', 'locations':'-124.46, 24.31, -66.57, 49.23', 
    function(stream) 
       stream.on('data', function (data) 
         data.geo  ? sockets.emit('twitter', data) : ''
    );
 );

或者如果这不起作用,在socket.emit之外添加socket.broadcast.emit,如下所示:

io.sockets.on('connection', function (socket) 

  var twitter = require('ntwitter'),
  util = require('util'),
  twit = new twitter(
    consumer_key: '',
    consumer_secret: '',
    access_token_key: '',
    access_token_secret: ''
  );

 twit.stream('statuses/filter', 'locations':'-124.46, 24.31, -66.57, 49.23', 
    function(stream) 
       stream.on('data', function (data) 
         data.geo  ? socket.emit('twitter', data) : ''
         data.geo  ? socket.broadcast.emit('twitter', data) : ''
    );
 );

【讨论】:

我这样做了,但是当我打开一个新标签时,新页面不起作用,但所有以前的标签都可以。就像新标签会以不更新自身为代价向所有其他标签生成广播。 嗯,是的,broadcast.emit 不会将其发送到套接字本身,而只会发送给所有其他人。但是,您也可以仅添加一行 socket.emit,这应该可以解决该问题)。 好的,这是有道理的。这样可行。这是处理多个连接的非常标准的方式,还是我只是对 websockets 和多个连接有一个基本的误解? 好吧,我最近实际上并没有对 socket.io 做太多的事情,所以当我重新开始使用它时,我学到的很多东西需要一点点刷新,但是,我总是不得不将broadcastemitemit 一起使用,所以看起来这就是Socket.IO 的工作方式。我对套接字并不是很清楚,所以我也可能会离开。 你在找io.sockets.emit;见this *** question。

以上是关于Socket.io 没有流式传输到多个连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 socket.io 流式传输网络摄像头

如何使用 node.js 和 socket.io 通过 WebSockets 流式传输 MP3 数据?

如何使用 Socket.io 禁用多路复用

Cors 标头未正确处理(http 请求很好,但 socke.io 连接不正确)

通过 websockets 的 Socket.io - 随机“传输端”断开连接

使用 Node.js HTTP API 或 Websockets 流式传输数据?