如何使用 socket.io 实现长轮询?

Posted

技术标签:

【中文标题】如何使用 socket.io 实现长轮询?【英文标题】:How to implement long polling with socket.io? 【发布时间】:2014-01-08 23:57:22 【问题描述】:

目前,我在 node.js 中创建了一个应用程序,以使用带有 mysql 的 socket.io 向所有客户端发送通知。因此,我的 mysql 数据库中的任何更改都将通过 socket.io 立即通知多个客户端。应用程序的工作魅力。

我面临的问题与性能问题有关。

我的浏览器不断收到来自服务器的推送通知,这降低了我的浏览器的性能。 I/Client 只需要在数据库更改时获取通知,其余时间服务器应处于暂停状态,而不向客户端发送任何消息。

换句话说,我需要实现长轮询技术。

我已经用谷歌搜索了一个示例,但我没有找到可以帮助我在 node.js 中使用 socket.io 和 mysql 实现长轮询

是否可以用socket.io实现长轮询?

如果是这样,有人可以将我重定向到一些有用的示例链接吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以强制 socket.io 仅使用长轮询:

io.set('transports', ['jsonp-polling']);

但我不认为长轮询是您正在寻找的解决方案。您应该独立于所使用的基础技术。我可能会这样做:

function writeToMysqlDb(data) 
    mySqlDriver.write(data); //whatever you use to write data to MySql
    socket.emit('dbChanged', data); //send the same data to all connected clients
;

我会将传输保留为默认选项:“传输默认为 websocket、htmlfile、xhr-polling、jsonp-polling”

【讨论】:

【参考方案2】:

您可以构建一个池来将持续推送的通知合并到每秒一个通知中,以减少推送次数。

【讨论】:

您好,尼尔森感谢您的回复。有没有应该如何实施的例子???因为我是这个 nodejs、socket.io 和长轮询世界的新手。任何例子都会帮助我。

以上是关于如何使用 socket.io 实现长轮询?的主要内容,如果未能解决你的问题,请参考以下文章

websocket——通信梳理(短轮询、长轮询、socket、websocket、socket.io)

React + axios 如何实现长轮询

如何实现基本的“长轮询”?

如何在原生 JavaScript 和 node.js 中使用长轮询?

DeferredResult 如何实现长轮询?

gevent中如何实现长轮询