SocketCluster / socketcluster-client

JavaScript client for SocketCluster
MIT License
291 stars 92 forks source link

Can't connect to wss/https #73

Closed Alcaros closed 7 years ago

Alcaros commented 7 years ago

client.js on Node.js 7.2.0

var socketCluster = require('socketcluster-client');
console.log("Socket Cluster Client version", socketCluster.version);
var socket = socketCluster.connect({
    hostname: 'localhost',
    protocol: 'https',
    port: 8500,
    rejectUnauthorized: false
});

socket.on('connect', function(status){
    console.log("connect", status);
});

socket.on('error', function(e){
    console.log("Error", e);
});

Output:

Socket Cluster Client version 5.2.4 Error { Error at SCSocket._onSCClose (/home/node/node_modules/socketcluster-client/lib/scsocket.js:597:15) at SCTransport. (/home/node/node_modules/socketcluster-client/lib/scsocket.js:286:12) at SCTransport.Emitter.emit (/home/node/node_modules/component-emitter/index.js:131:20) at SCTransport.SCEmitter.emit (/home/node/node_modules/sc-emitter/index.js:28:26) at SCTransport._onClose (/home/node/node_modules/socketcluster-client/lib/sctransport.js:175:30) at WebSocket.wsSocket.onerror (/home/node/node_modules/socketcluster-client/lib/sctransport.js:104:12) at WebSocket.onError (/home/node/node_modules/ws/lib/WebSocket.js:452:14) at emitOne (events.js:96:13) at WebSocket.emit (events.js:188:7) at ClientRequest.onerror (/home/node/node_modules/ws/lib/WebSocket.js:711:10) name: 'SocketProtocolError', message: 'Socket hung up', code: 1006 }

But I using socketcluster-client on browser and can connect to https server

Alcaros commented 7 years ago

This is host options

var options = {
  host: 'localhost',
  workers: Number(argv.w) || Number(process.env.SOCKETCLUSTER_WORKERS) || 3,
  brokers: Number(argv.b) || Number(process.env.SOCKETCLUSTER_BROKERS) || 1,
  port: Number(argv.p) || Number(process.env.SOCKETCLUSTER_PORT) || 8500,
  // If your system doesn't support 'uws', you can switch to 'ws' (which is slower but works on older systems).
  wsEngine: process.env.SOCKETCLUSTER_WS_ENGINE || 'uws',
  appName: argv.n || process.env.SOCKETCLUSTER_APP_NAME || null,
  workerController: workerControllerPath || __dirname + '/worker.js',
  brokerController: brokerControllerPath || __dirname + '/broker.js',
  initController: initControllerPath || null,
  socketChannelLimit: Number(process.env.SOCKETCLUSTER_SOCKET_CHANNEL_LIMIT) || 1000,
  clusterStateServerHost: argv.cssh || process.env.SCC_STATE_SERVER_HOST || null,
  clusterStateServerPort: process.env.SCC_STATE_SERVER_PORT || null,
  clusterAuthKey: process.env.SCC_AUTH_KEY || null,
  clusterStateServerConnectTimeout: Number(process.env.SCC_STATE_SERVER_CONNECT_TIMEOUT) || null,
  clusterStateServerAckTimeout: Number(process.env.SCC_STATE_SERVER_ACK_TIMEOUT) || null,
  clusterStateServerReconnectRandomness: Number(process.env.SCC_STATE_SERVER_RECONNECT_RANDOMNESS) || null,
  crashWorkerOnError: argv['auto-reboot'] != false,
  pingTimeout: 1800000,
  protocol: 'https',
  protocolOptions: {
    key: fs.readFileSync(__dirname + '/privkey.pem', 'utf8'),
    cert: fs.readFileSync(__dirname + '/cert.pem', 'utf8'),
    passphrase: ''
  },
  socketUpgradeTimeout: 5000,
  logLevel: 2
};
zalmoxisus commented 7 years ago

You should use secure: true instead of protocol: 'https' in socketcluster-client.

jondubois commented 7 years ago

That's such a common mistake, I should probably make the client throw an error or something...

Alcaros commented 7 years ago

I trying option secure: true and it stills hung up.

Alcaros commented 7 years ago

I create a simple page for test wss/ws connection at http://mylive.in.th/testwebsocket It works fine on browser both wss/ws but can connect only ws:// websocket server with nodejs.

<body>
        <div><strong>Secured Websocket Connection (port:8500)</strong></div>
        <div id="socket1"></div>
        <div><strong>Unsecured Websocket Connection (port:80)</strong></div>
        <div id="socket2"></div>
    </body>

    <script src="//jquery/jquery-3.1.1.min.js"></script>
    <script src="//socketcluster/socketcluster.min.js"></script>

    <script>
    // Secured websocket connection
    var socket = socketCluster.connect({
        hostname: 'chat.socket3.mylive.in.th',
        secure: true,
        port: 8500
    });

    // Unsecured websocket connection
    var socket2 = socketCluster.connect({
        hostname: 'chat.socket3.mylive.in.th',
        secure: false,
        port: 80
    });

    socket.on('error', function(e){
        $("#socket1").html(e.name);
        console.log(e);
    });

    socket.on('connect', function(status){
        $("#socket1").html("connected");
    });

    socket2.on('error', function(e){
        $("#socket2").html(e.name);
        console.log(e);
    });

    socket2.on('connect', function(status){
        $("#socket2").html("connected");
    });
    </script>
Alcaros commented 7 years ago

Problem solved.

  protocolOptions: {
    key: fs.readFileSync(__dirname + '/privkey.pem'),
    cert: fs.readFileSync(__dirname + '/fullchain.pem')
}

Change cert.pem to fullchain.pem. (letsencrypt cert)