【问题标题】:Nodejs - Socketio not working with https server, what could be the reason?Nodejs - Socketio 不能与 https 服务器一起使用,可能是什么原因?
【发布时间】:2014-03-26 02:23:43
【问题描述】:

我尝试使用 http 服务器进行调试,并且 socket.io 工作,但是当我尝试使用 https 时 socket.io 停止工作

// create server for http and https
//var httpserver = http.createServer(app).listen('3000', '127.0.0.1');
var https_server = https.createServer(options, app).listen('4000', '127.0.0.1');
// let the backend listens to this server
UserServer.listen(https_server);
//UserServer.listen(httpserver);


exports.listen = function(server){

    io = socketio.listen(server);
    io.sockets.on('connection', function(socket){
        console.log("Socket is connected, sweet ");
    });
} 

var httpserver = http.createServer(app).listen('3000', '127.0.0.1');
UserServer.listen(httpserver);

打印出来

Socket is connected, sweet "

var https_server = https.createServer(options, app).listen('4000', '127.0.0.1');
UserServer.listen(https_server);

没有输出

这是我的 https 设置

var express = require('express'),               
    https = require('https'),
        fs = require('fs'); 



var options = {
  key: fs.readFileSync('./key.pem', 'utf8'),
  cert: fs.readFileSync('./cert.pem', 'utf8')
};

我能够显示 https 页面,所以我猜 https 设置不是问题

任何建议将不胜感激,谢谢

【问题讨论】:

    标签: node.js sockets https socket.io


    【解决方案1】:

    首先,你需要运行Node.js Server with SSL

    Server.js

    var fs = require('fs');    
    var options = {
        key: fs.readFileSync('ssl/private/domain.com.key'),
        cert: fs.readFileSync('ssl/certs/domain.com.crt'),
        ca: fs.readFileSync('ssl/certs/domain.com.cabundle')
    };
    // You can do this easily if you are on windows 
    // var options = { pfx: fs.readFileSync('/home/mydir/secure.pfx'); };
    var app = require('https').createServer(options, handler),
        io = require('socket.io').listen(app);    
    
    //Recommended Production settings
    io.enable('browser client minification');  // send minified client
    io.enable('browser client etag');          // apply etag caching logic based on version number
    io.enable('browser client gzip');          // gzip the file
    io.set('log level', 1);                    // reduce logging
    io.set('flash policy port', 3300); //==>  override Flash Policy Port  
    io.set('transports', [                     // enable all transports (optional if you want flashsocket)
        'websocket'
      , 'flashsocket'
      , 'htmlfile'
      , 'xhr-polling'
      , 'jsonp-polling'
    ]);
    function handler(req, res) {
        res.writeHead(200);
        res.end("welcome sir!");
    };    
    io.sockets.on('connection', function (socket) {
        socket.on('message', function (data) {
            socket.broadcast.emit('message', data);
        });
    });    
    app.listen(3300);
    

    Client.js

       //socketAddress is server uri  ex. https://www.domain.com:3300
       var socket = io.connect(socketAddress, {'flash policy port':3300} );
       socket.on('connect', function (data) {
          //.... 
       });
       socket.on('message', function (data) {
          //.... 
       });
    

    【讨论】:

    • 谢谢,除了您配置的 io.set 之外的所有代码我都了解,您能详细说明一下吗?
    • 它与https没有直接关系,它只是Recommended Production settings更多信息你可以通过这个link
    • 我理解这个概念,但你能告诉我options 是什么吗?我查看了您的链接,它们在那里有不同的值。我想他们应该以某种方式指向 SSL 证书,但你能详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2017-02-22
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多