繁体   English   中英

Node.js Socket.io HTTPS-传输轮询

[英]Node.js Socket.io HTTPS - transport polling

我正在将Nginx与ssl证书一起使用,这给了我网站的https版本,很棒。 问题是除非我使用常规的http连接,否则我的socket.io通信不起作用。 如果这有点长,我深表歉意,但是我不确定我在这里做什么,并想确保你们拥有您可能需要知道的一切。 我尝试了各种不同站点的解决方案,其中一些站点位于此处,但没有一个起作用。

我尝试手动创建https服务器,而不是让express这样做,但这导致根本不加载任何内容,使用当前的实现,我至少可以看到该站点。

upstream project {
   server example.org:4000;
}

server {
   listen 80;
   return https://$host$request_uri;
}

server {
   listen 443 ssl default_server;
   listen [::]:443 ssl default_server;
   ssl_certificate /home/adam/SSL/public.crt;
   ssl_certificate_key /home/adam/SSL/example.org.key;
   ssl_prefer_server_ciphers on;

   location / {
     proxy_pass http://example.org;
   }
}

这似乎在起作用,因为当我转到网站时,它会自动将我带到https版本并加载页面。 问题是何时客户端尝试连接时我不断得到:

https:// MY_SERVER_IP:4040 / socket.io /?EIO = 3&transport = polling&t = M0CPjUDnet :: ERR_CONNECTION_CLOSED

打印到控制台

这是我的客户端和服务器代码:

var IPaddress = 'https://MY_SERVER_IP:4040';
var socket = io.connect(IPaddress,{secure:true});
socket.on('connect', function (socket) {
    console.log('Connected!');
});

服务器代码:

var express = require('express');
var app = express();
var privateKey = fs.readFileSync(__dirname+'/SSL/example.com.key','utf8');
var certificate = fs.readFileSync(__dirname+'/SSL/public.crt','utf8');
var intermediate = fs.readFileSync(__dirname+'/SSL/intermediate.crt','utf8');
var options = {key:privateKey,cert:certificate,ca:intermediate};

var io = require('socket.io').listen(4040,options);
//var io = require('socket.io').listen(4040);
io.sockets.on('connection', function (socket) {
    socket.on('disconnect',function(){
       console.log("A client has left us :(");
    });
});
app.listen(4000);

更新-02/12/2017

在我的代码中,我有这行:

require('./routes.js')(app);

其中包含:

module.exports = function(app) {

    app.get('/main',function(req,res){
        if (req.session.user == null){
            // if user is not logged-in redirect back to login page //
            res.redirect('/');
        }   else{
            res.sendFile(path.join(__dirname + '/FrontEnd/main.html'));
        }
    });

    // viewed at http://localhost:8080
    app.get('/', function(req, res) {
        if(req.cookies.user == undefined || req.cookies.pass == undefined){
            res.sendFile(path.join(__dirname + '/FrontEnd/login.html'));
        }else {
            //attempt automatic login
            AM.autoLogin(req.cookies.user,req.cookies.pass,function(o){
               if(o !=null){
                   req.session.user = o;
                   res.sendFile(path.join(__dirname + '/FrontEnd/home.html'));
               }else{
                   res.sendFile(path.join(__dirname + '/FrontEnd/login.html'));
               }
            });

        }
    });

......

这可能会导致502错误的网关错误吗?

扩展我的评论,在您当前的服务器代码中,express和socket.io都仅接受常规的HTTP连接。 socket.io listen(port[, options])函数不接受HTTPS连接。

您从正确的方法开始,手动创建了HTTPS服务器。 然后,您需要将express和socket.io附加到该服务器。

var fs = require('fs');
var express = require('express');
var app = express();
var privateKey = fs.readFileSync(__dirname + '/SSL/example.com.key', 'utf8');
var certificate = fs.readFileSync(__dirname + '/SSL/public.crt', 'utf8');
var intermediate = fs.readFileSync(__dirname+'/SSL/intermediate.crt', 'utf8');
var options = { key: privateKey, cert: certificate, ca: intermediate };

// Create our HTTPS server here and attach express to it
var server = require('https').createServer(options, app);

// Attach socket.io to our existing HTTPS server
var io = require('socket.io')(server); 

io.sockets.on('connection', function (socket) {
    socket.on('disconnect', function() {
       console.log("A client has left us :(");
    });
});
server.listen(4000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM