NodeJS的Socket.io似乎不能用作websocket服务器
出于某种原因,socket.io总是回退到长轮询,如果我强制使用websocket传输层,它将出错:
失败:连接在收到握手响应之前关闭
右侧端口打开。我使用的是socket.io中的聊天示例。我在上设置了服务器http://jmi.io:3000.正如你所看到的,它与一个漂亮的长轮询通道配合使用很好,但现在尝试从websocket客户端连接websocket,然后。。。
到"ws://jmi:3000/"的WebSocket连接失败:在接收到握手响应之前,连接已关闭
我只有一个单线程节点,并且拥有与聊天示例repo中完全相同的package.json。
{
"name": "socket-chat-example",
"version": "0.0.1",
"description": "my first socket.io app",
"dependencies": {
"express": "4.3.1",
"socket.io": "1.2.0"
}
}
感谢您的帮助
我遇到了完全相同的问题,因为我定义了两次"io"。仔细检查代码中定义io的位置,并确保没有两次定义变量io。
我做错了什么的例子:
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var io = require('socket.io').listen(server.listen(config.port, config.ip, function () {
console.log('Express server listening on %d, in %s mode', config.port,
app.get('env'));
}));
解决问题的示例:
var server = require('http').createServer(app);
var io = require('socket.io')(server);
server.listen(config.port, config.ip, function () {
console.log('Express server listening on %d, in %s mode', config.port,
app.get('env'));
});
与@Lucas Klaassen的回答略有关联:我有以下内容:
let express = require('express');
let app = express();
let http = require('http').Server(app);
let io = require('socket.io')(http);
// this is the culprit:
app.listen(port);
更改最后一行是修复它的原因:
http.listen(port);
在我的案例中,问题是我通过browser-sync
代理服务器
browserSync({
//server: {
// // src is included for use with sass source maps
// baseDir: ['public', 'src']
//},
proxy: "localhost:4045",
port: 4046
因此,这将失败,但在生产中效果良好。
以下是我们一个工作项目的完整工作示例:
const websocket = require('ws');
const http = require('http');
const express = require('express');
const app = express();
const server = http.createServer(app);
wss = new websocket.Server({ server });
app.on('upgrade', wss.handleUpgrade);
wss.on('connection', ws => {
console.log('web socket connection is alive');
}
server.listen(8080, () => {
console.log('server started on PORT 8080');
});
从介质转换
它对我有用!
restUrl = 'http://x.x.x.x:5555;
socket = io(this.restUrl, {
transports: ["websocket"],
upgrade: true,
upgradeTimeout: 6000000,
pingTimeout: 15000000000,
pingInterval: 1500000000,
maxHttpBufferSize: 10000000,
});
connect() {
if (this.socket.connected == false) {
var temp = this;
this.socket.connect();
this.socket.on('event', function (data) {
temp.socketData.next(data);
});
}
}