我相信问题在于您在服务器端和客户端设置 socket.io 的方式。
这是我如何使它工作的(只为你)。
服务器:
var debug = require('debug')('httpssetuid');
var app = require('../app');
var http = require('http');
var https = require('https');
var fs = require('fs');
var exec = require('child_process').exec;
var EventEmitter = require('events').EventEmitter;
var ioServer = require('socket.io');
var startupItems = [];
startupItems.httpServerReady = false;
startupItems.httpsServerReady = false;
var ee = new EventEmitter();
ee.on('ready', function(arg) {
startupItems[arg] = true;
if (startupItems.httpServerReady && startupItems.httpsServerReady) {
var id = exec('id -u ' + process.env.SUDO_UID, function(error, stdout, stderr) {
if(error || stderr) throw new Error(error || stderr);
var uid = parseInt(stdout);
process.setuid(uid);
console.log('de-escalated privileges. now running as %d', uid);
setInterval(function cb(){
var rnd = Math.random();
console.log('emitting update: %d', rnd);
io.emit('update', rnd);
}, 5000);
});
};
});
app.set('http_port', process.env.PORT || 80);
app.set('https_port', process.env.HTTPS_PORT || 443);
var httpServer = http.createServer(app);
var opts = {
pfx: fs.readFileSync('httpssetuid.pfx')
};
var httpsServer = https.createServer(opts, app);
var io = new ioServer();
httpServer.listen(app.get('http_port'), function(){
console.log('httpServer listening on port %d', app.get('http_port'));
ee.emit('ready', 'httpServerReady');
});
httpsServer.listen(app.get('https_port'), function(){
console.log('httpsServer listening on port %d', app.get('https_port'));
ee.emit('ready', 'httpsServerReady');
});
io.attach(httpServer);
io.attach(httpsServer);
io.on('connection', function(socket){
console.log('socket connected: %s', socket.id);
});
客户:
script(src='/socket.io/socket.io.js')
script.
var socket = io();
socket.on('update', function(update){
document.getElementById('update').innerHTML = update;
});
以下是服务器的关键点:
- 需要 socket.io 但不要调用它的监听方法(假设已经需要 http 和 https)。相反,只需保留参考。(var ioServer = require('socket.io'))
- 创建您的 http 和 https 服务器
- 创建一个新的 ioServer 实例
- 绑定您的 http 和 https 服务器 (.listen)
- 将 http&https 服务器实例附加到 io 实例。(.listen 是 .attach 的别名)
- 设置 io 事件。
和客户端(玉语法,但你明白了):
- 包含 socket.io 脚本标签
- 调用 io 并捕获参考
- 设置您的事件处理程序
在客户端上,您不需要调用 io.connect()。此外,我不确定您的选择。看起来您有一个错字 (, ,),我在 1.0 文档中找不到任何对 secure: true 的引用。