目前node.js 有大量的websocket库,最流行的似乎是:
然而,我找不到任何一个之间的任何具体的具体比较...显然Socket.io很棒,但已经过时了,并且已经失败了.ws和websocket-node都声称它们是最快的.而engine.io似乎是新的,但比较轻的aletarntives重得多.
如果我们或某人能够将一个答案作为指导,使用哪个套接字库以及何时使用它们,以及它们之间的比较,那将是惊人的.
我最近遇到了关于内存泄漏和扩展问题的Socket.io问题.我决定使用Socket.io是在一年前做出来的,当时它无疑是最好的库.
既然Socket.io造成了很多麻烦,我花时间寻找在此期间可用的替代品,并认为Engine.io和SockJS通常都适合我.但是,在我看来,两者都有一些缺点,我不确定选择哪一个.
Engine.io基本上是Socket.io的完美轻量级版本,它不包含我不需要的所有功能.我已经为Socket.io编写了自己的重新连接和心跳逻辑,因为我对默认逻辑不满意,我从不打算使用Socket.io提供的房间或其他功能.
但是 - 在我看来 - Engine.io的主要缺点是建立连接的方式.客户端以较慢的jsonp-polling开始,如果它们支持更好的传输,则会升级.该支持WebSockets的原生(数量不断增加)的客户有超过那些使用过时的浏览器客户更长的和不稳定的连接过程的形式不利的事实,违背我的,应该如何处理的感觉.
另一方面,SockJS完全按照我的意愿处理连接.根据我的阅读,它似乎相当稳定,而Engine.io目前有一些问题.
我的应用程序在单个域上的Nginx路由器后面运行,因此我不需要SockJS提供的跨域功能.但是,由于提供此功能,SockJS根本不公开客户端的cookie数据.到目前为止,我通过cookie和查询字符串令牌对Socket.io进行了2因素授权,而这对SockJS来说是不可能的(使用Engine.io).
我已经阅读了几乎所有可用的内容和两者的优点和缺点,但似乎到目前为止没有太多讨论或发布,特别是关于Engine.io(这里只有8个问题用engine.io标记).
你喜欢哪2个图书馆中的哪一个?你在生产中使用它们吗?
哪一个可能会更积极地维持,并且在未来可能比另一个更具优势?
我正处于一个项目的开始,即构建一个跨越网站和Android应用程序的实时聊天应用程序.由于我想阻止对各种API调用的持续轮询,我想使用websockets(我没有经验),在这个过程中,我认为学习node.js是个好主意.所以我需要开始为node.js使用websockets lib.为此,我看到有很多选项.我最常读的是socket.io.
在SO附近我也读到了socket.io v0.9非常错误,我看到有关engine.io的多个引用是来自socket.io版本1.0的socket.io的新后端,它应该是"即将到来".所有这些消息都来自2012年(例如这个),当我看一下socket.io网站时,我发现它们仍处于v0.9,这让我想到了几件事:
欢迎所有提示!
你怎么能检测到你在 socket.io 连接上收到了一条你没有处理程序的消息?
例子:
// client
socket.emit('test', 'message');
// server
io.on('connection', function (socket) {
console.log('connection received...');
// logs all messages
socket.conn.on('message', function(data) {
console.log('this gets every message.');
console.log('how do I get just the ones without explicit handlers?');
});
socket.on('other' function(data) {
console.log('expected message');
});
}
Run Code Online (Sandbox Code Playgroud) 有没有办法让单独的 websocket 服务器socket.io
在不同的路径上工作?
let http = require('http');
let express = require('express');
let socketio = require('socket.io');
let websocket = require('ws');
let httpServer = http.createServer();
let expressApp = express();
httpServer.on('request', expressApp);
let socketioServer = socketio(httpServer, { path: '/aaaaa/socket.io/' });
socketioServer.of('/').on('connect', () => {});
let websocketServer = new websocket.Server({ server: httpServer, path: '/aaaaa/graphql' });
httpServer.listen(2233, () => console.log('started'));
Run Code Online (Sandbox Code Playgroud)
我看到的行为是,当创建一个单独的 websocket 服务器时,它socket.io
仍然可以正常运行,但不会升级到 websocket 的连接并且失败并出现错误(来自 chrome):
WebSocket connection to 'ws://localhost:2233/aaaaa/socket.io/?EIO=3&transport=websocket&sid=fx4pOT0cegz65JMCAAAB' failed: Invalid frame header
Run Code Online (Sandbox Code Playgroud)
需要明确的是,如果省略 websocket 服务器行,则socket.io
可以正常工作。
我的具体用例是apollo-server-express …
我使用 Helmet 和 Express 从服务器端设置相当多的安全 HTTP 标头。当在 Node.js 应用程序顶部渲染客户端页面时,使用以下命令,这做得很好:
\n\nvar app = express();\napp.use(helmet());\n..\nres.render("pages/index", data);\n
Run Code Online (Sandbox Code Playgroud)\n\n索引页上的所有资源都将具有 Helmet 标题。不幸的是,socket.io 有自己的标头管理。因此,/socket.io/ 之后的任何内容都将具有不安全/其自己的标头。例如这里:
\n\n<https_path>/socket.io/socket.io.js\n<https_path>/socket.io/?EIO=3&transport=polling&t=Lj4CFnj&sid=ILskOFWbHUaU6grTAAAA\n
Run Code Online (Sandbox Code Playgroud)\n\n因此,我想手动为所有 socket.io 项目设置自定义标头。
\n\n这就是我需要 socket.io 的方式(仅摘录):
\n\n/src/app.js
\n\nvar express = require("express");\nvar sio = require("socket.io");\nvar app = express();\nvar io = require("./../lib/io.js").initialize(app.listen(REST_PORT, () => {\n logger.info("Application ready on port " + REST_PORT + " . Environment: " + NODE_ENV);\n}));\n
Run Code Online (Sandbox Code Playgroud)\n\n/lib/io.js
\n\nexports = module.exports = {};\nvar sio = require("socket.io");\nexports.initialize = function(server) {\n var options …
Run Code Online (Sandbox Code Playgroud)