如何使用node.js使Socket IO在HTTPS上工作

时间:2017-11-17 23:00:11

标签: node.js ssl socket.io

这让我感到沮丧,就像疯了一样!

我正在使用代理,以便任何发送到myurl / APP /的请求由myurl上的node.js回答:8001

我现在需要这个来处理https。容易......我想。

我让Apache从公共文件夹中提供旧版本。这是独立的,当我完成这个,它将被删除。但是现在需要保持机智和可访问性。让我们设置加密。并且https://myurl工作正常,当然显示公用文件夹中的内容。

如果我转到https://myurl:8001,则Chrome会说“无法访问网站”。如果我去http://myurl:8001它工作正常。我认为这是因为https默认端口是443.我有VPS不专用所以我不认为我可以改变它。当然,如果我确实改变了ssl端口,那么它将不适用于公共文件夹??

我将向您展示最新情况;

app.js;

Exec

客户端/ index.html中;

   var express = require('express');
var app = express();
var serv = require('http').Server(app);

app.get('/',function(req, res) {
    res.sendFile(__dirname + '/client/index.html');
});
app.use('/client',express.static(__dirname + '/client'));

serv.listen(8001);
console.log("Server started.");

var SOCKET_LIST = {};

var io = require('socket.io')(serv,{});
io.sockets.on('connection', function(socket){
    socket.id = Math.random();
    socket.x = 0;
    socket.y = 0;
    socket.number = "" + Math.floor(10 * Math.random());
    SOCKET_LIST[socket.id] = socket;

    socket.on('disconnect',function(){
        delete SOCKET_LIST[socket.id];
    });

});

setInterval(function(){
    var pack = [];
    for(var i in SOCKET_LIST){
        var socket = SOCKET_LIST[i];
        socket.x++;
        socket.y++;
        pack.push({
            x:socket.x,
            y:socket.y,
            number:socket.number
        });    
    }
    for(var i in SOCKET_LIST){
        var socket = SOCKET_LIST[i];
        socket.emit('newPositions',pack);
    }




},1000/25);

它的工作正常,因为代码只是通过http。我需要这个来处理SSL

我需要这条线在其https;

时工作
<canvas id="ctx" width="500" height="500" style="border:1px solid #000000;"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>

<script>
    var ctx = document.getElementById("ctx").getContext("2d");
    ctx.font = '30px Arial';

    var socket = io.connect('http://www.myurl:8001', {path: "/socket.io"});

    socket.on('newPositions',function(data){
        ctx.clearRect(0,0,500,500);
        for(var i = 0 ; i < data.length; i++)
            ctx.fillText(data[i].number,data[i].x,data[i].y);      
    });
</script>

这怎么可能?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您的服务器代码仅创建一个http服务器,而不是https服务器,因为socket.io使用您的http服务器,它只能在http上运行。 http和https服务器不同(https服务器实现了http服务器不存在的证书验证和数据加密)。

要创建https服务器,请更改此:

var express = require('express');
var app = express();
var serv = require('http').Server(app);

到此:

const express = require('express');
const app = express();
const options = {...};    // fill in relevant certificate info here
const serv = require('https').createServer(options, app);

而且,您必须在options数据结构中填写相应的certificateinfo。

https.createServer()代码示例为here

然后,只要您使用https URL和正确的端口号连接到任何端口,就可以在任何端口上运行https服务器。你是正确的,https URL的默认端口是443,所以如果没有指定端口号,那么浏览器将尝试使用它。

答案 1 :(得分:0)

好吧这有点令人尴尬......我遇到的实际问题是因为以下原因。

如果你能遵循这个大声笑......

因此在dreamhost中,它们允许您以通常的方式运行apache并提供内容。有一个/ public文件夹。相当标准的东西。 因为我试图扩展到能够使用套接字(请不要告诉我使用PHP的套接字......放手吧!)所以我使用的是dreamhost,允许一个人代理一个node.js app通过一个端口。例如。端口xxxx最终在网站上/ whateverfolderyouchoose /

好吧,在我的node.js中,我正在使用快递。现在在快递中你可以指定路由真的很容易。对于一些古怪的原因,我不能为实际找出原因而烦恼,如果你知道请赐教我......我必须在路由中加上双正斜杠,就像这样&#34; // whateverroute /&#34;。我正在学习的所有例子都使用一个正斜杠。例如&#34; / whateverroute /&#34;但那并没有奏效。如果你知道原因,请告诉我们。所以在我弄清楚之前,我无法正确地路由任何东西,因此必须在末尾使用带端口号的url。当然会搞砸https。例如,https://www.theurl.com:xxxx不安全,因为node.js应用程序没有运行https res req服务器。实际上我确实设置了https节点服务器,并认为这是问题的解决方案。

因此,这个奇怪问题的解决方案是node.js路由。当然,愚蠢的复杂因为,当你从谷歌学习而不是真正知道你确切设置的人时,嘿生活就像那样。

结果有趣的是,我不能站在node.js.我可以看到使用它的好处。但是对于像我正在做的那样简单的事情,似乎有很多球疼痛。此外,我现在已经发现手机/差距所以PHP实际上是可以的,我想做什么。好的,所以我使用AJAX请求多次使用服务器方式,但它现在正在处理几百个用户,当它达到10&000; 000标记时,网站可能无法很好地工作,我应该做足以让一个真正的node.js程序员学习....希望。

我非常感谢帮助你们。