node.js中socket.io和websockets之间有什么区别?
它们都是服务器推送技术吗?我觉得唯一的区别是,
socket.io允许我通过指定事件名称来发送/发送消息.
在socket.io的情况下,来自服务器的消息将到达所有客户端,但对于websockets中的相同内容,我被迫保留所有连接的数组并循环通过它以向所有客户端发送消息.
另外,我想知道为什么网络检查员(如Chrome/firebug/fiddler)无法从服务器捕获这些消息(来自socket.io/websocket)?
请澄清一下.
我有 :
Apache
(v2.4)在我的服务器的端口80上www.domain1.com
,启用了mod_proxy和mod_proxy_wstunnel
node.js + socket.io
在同一服务器的端口3001上.
www.domain2.com
由于此处描述的方法,访问(使用端口80)重定向到2 . 我在Apache配置中设置了这个:
<VirtualHost *:80>
ServerName www.domain2.com
ProxyPass / http://localhost:3001/
ProxyPassReverse / http://localhost:3001/
ProxyPass / ws://localhost:3001/
ProxyPassReverse / ws://localhost:3001/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
除了websocket部分之外,它适用于所有内容:ws://...
不会像代理那样传输.
当我访问该页面时www.domain2.com
,我有:
Impossible to connect ws://www.domain2.com/socket.io/?EIO=3&transport=websocket&sid=n30rqg9AEqZIk5c9AABN.
Run Code Online (Sandbox Code Playgroud)
问题:如何使Apache代理也成为WebSockets?
我正在构建一个部署到Heroku的App,它使用Websockets.
当我只使用1个dyno时,websockets连接正常工作,但当我缩放到> 1时,我得到以下错误
POST http://****.herokuapp.com/socket.io/?EIO = 2&transport = polling&t = 1412600135378-1&sid = zQzJJ8oPo5p3yiwIAAAC 400(错误请求)socket.io-1.0.4.js:2
WebSocket连接到'ws://****.herokuapp.com/socket.io/?EIO = 2&transport = websocket&sid = zQzJJ8oPo5p3yiwIAAAC'失败:WebSocket在建立连接之前关闭.socket.io-1.0.4.js:2
我正在使用Redis适配器来启用多个Web进程
var io = socket.listen(server);
var redisAdapter = require('socket.io-redis');
var redis = require('redis');
var pub = redis.createClient(18049, '[URI]', {auth_pass:"[PASS]"});
var sub = redis.createClient(18049, '[URI]', {detect_buffers: true, auth_pass:"[PASS]"} );
io.adapter( redisAdapter({pubClient: pub, subClient: sub}) );
Run Code Online (Sandbox Code Playgroud)
这正在localhost(我正在使用工头运行,正如Heroku所做的那样,我正在启动2个Web进程,与Heroku相同).
在我实现redis适配器之前,我遇到了Web套接字握手错误,因此适配器已经产生了一些影响.此外它现在偶尔工作,我假设当套接字匹配相同的web dyno.
我也尝试启用粘性会话,但它永远不会有效.
var sticky = require('sticky-session');
sticky(1, server).listen(port, function (err) {
if (err) {
console.error(err);
return process.exit(1);
}
console.log('Worker listening on %s', port); …
Run Code Online (Sandbox Code Playgroud) 我是socket.io的新手,并在node/express/socket.io中编写了我的第一个应用程序.现在一切都在我的nginx服务器上运行良好.我想向公众发布我的应用程序,但我担心它不适用于很多人.我有几个朋友测试我的应用程序,一切顺利(这是一个非常简单的应用程序).这是我的担忧:现在每个连接似乎都在使用websockets,这就是我想要的.但是,由于客户端的一些奇怪的东西,我的应用程序有时会降级为"轮询"吗?如果是这样,socket.io如何决定何时使用轮询以及何时使用websocket(它是基于浏览器/版本或连接还是什么)?我很确定它在可能的情况下使用websocket,但是有一个列表可以将其归结为"轮询"吗?此外,有没有办法我可以通过使用"轮询"来检查我的应用程序是否有效?
我可以发布代码,但我认为这是关于socket.io如何工作的一般问题.
当我在电子中运行 socket.io 时,我在开发人员控制台中不断收到此错误。
engine.io-client:socket probe transport "websocket" failed because of error: transport closed +6s
Run Code Online (Sandbox Code Playgroud)
当我建立它时,套接字总是立即断开连接。我的客户甚至没有得到 socket.emit 我一建立连接就做,直到一两分钟后。
客户端和服务器使用相同版本的 socket.io。
服务器:
io.on('connection', function(socket){
socket.emit('got it','');
console.log('Socket connection established');
});
Run Code Online (Sandbox Code Playgroud)
客户:
var socket = require('socket.io-client')('http://localhost:3000');
console.log(socket);
socket.on('got it', function(a){
console.log('connected');
console.log(socket);
})
Run Code Online (Sandbox Code Playgroud)
这不是完整的代码,但是除了一些不应该影响连接的其他侦听器之外,没有其他任何东西可以与 websockets 交互。
服务器没有显示任何问题。每次有人连接时它都会告诉我,但是当我尝试以任何一种方式发出任何内容时,收件人都不会立即得到它。每次单击发送发射的按钮时,我都会看到“发射带有 ack id x 的数据包”,但服务器看不到它。这个问题是间歇性的,好像我稍等一下,服务器和客户端将能够连接,但一段时间后它们仍然会随机断开连接。
背景
要从 Unity 连接到我的 websocket,我正在使用ws://localhost:3000/socket.io/?EIO=4&transport=websocket
. 如果我通过浏览器点击该链接,我会看到以下内容:
{"code":3,"message":"Bad request"}
Run Code Online (Sandbox Code Playgroud)
在这一点上,我为我的 NodeJS 应用程序强制使用 websockets,io.set('transports', ['websocket']);
但随后我的应用程序停止工作。
题
如何确保 websockets 可用于 NodeJS+SocketIO?
代码
应用程序.js
var app = require('express')();
var http = require('http').Server(app);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
var server = app.listen(3000, function () {
var host = server.address().address
var port = server.address().port
});
var io = require('socket.io').listen(server);
//io.set('transports', ['websocket']);
...
Run Code Online (Sandbox Code Playgroud)
设置