xbd
xbd

Reputation: 975

Nodejs - Socketio not working with https server, what could be the reason?

I tried debugging using http server, and socket.io worked, however when I try to use https socket.io stopped working

// 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 ");
    });
} 

When

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

Print out

Socket is connected, sweet "

When

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

There are no output

Here are my set up for 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')
};

I was able to display the https page, so I am guessing https setup was not the problem

Any advice would be appreciated, thanks

Upvotes: 2

Views: 3122

Answers (1)

Amol M Kulkarni
Amol M Kulkarni

Reputation: 21649

First of all, you need to run 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) {
      //.... 
   });

Upvotes: 1

Related Questions