【问题标题】:How to make Socket IO work over HTTPS using node.js如何使用 node.js 使 Socket IO 在 HTTPS 上工作
【发布时间】:2017-11-17 23:00:11
【问题描述】:

这让我很沮丧!

我正在使用代理,因此任何发往 myurl/APP/ 的请求都由 myurl:8001 处的 node.js 回答

我现在需要这个在 https 上工作。容易……我想。

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

如果我转到https://myurl:8001,则 chrome 会显示“无法访问站点”。如果我去http://myurl:8001 它工作正常。我认为这是因为 https 默认端口是 443。我的 VPS 不是专用的,所以我认为我无法更改它。当然,如果我确实更改了 ssl 端口,那么它对公用文件夹不起作用??

我将向您展示发生的基本情况;

app.js;

   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);

客户端/index.html;

<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>

它可以像代码一样正常工作,但只能通过 http。我需要这个在 SSL 上工作

我需要这条线在它的 https 时工作;

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

这怎么可能?

非常感谢任何帮助。

【问题讨论】:

  • 在将路由从单个正斜杠更改为双斜杠之后。我不再需要使用端口,而是可以使用 url 路径,所以 var socket = io.connect('myurl:8001', {path: "/socket.io"});变成了 var socket = io.connect('myurl/theappfolder', {path: "/socket.io"});

标签: node.js ssl socket.io


【解决方案1】:

您的服务器代码只是创建一个 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 数据结构中填写适当的证书信息。

https.createServer() 代码示例为here

然后,您可以在您想要的任何端口上运行您的 https 服务器,只要您使用 https URL 和正确的端口号连接到它。 https URL 的默认端口是 443 是正确的,因此如果未指定端口号,则浏览器将尝试使用该端口号。

【讨论】:

  • 感谢 Jfriend00 的回复 - 我已经解决了这个问题。我现在没有时间写一个详细的版本来说明我是如何解决它的,但是是的,你是对的……我必须创建一个 https 服务器。我实际上要做的是在一个单独的端口上监听 socket.io。实际上,我会制作一个视频向像我这样的傻瓜解释它,因为即使有大量关于此的信息......当我说的时候相信我,这些信息对傻瓜不好。但我有它的工作,一旦我有时间就会传授知识:-)
  • @FeelsUnique - 好吧,除非你希望你的 web 服务器是 http 并且你的 socket.io 是 https,没有技术上的原因 web 服务器和 socket.io 不能在同一个港口。到目前为止,您还没有描述任何实际需要单独端口的产品需求。
  • @FeelsUnique - 这回答了你的问题吗?如果是这样,您可以通过单击答案旁边的复选标记向社区表明这一点,并通过在 stackoverflow 上遵循正确的程序为自己赢得一些声誉积分。
【解决方案2】:

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

如果你能按照这个大声笑...

因此,在 Dreamhost 中,它们允许您以通常的方式运行 apache 并提供内容。有一个 /public 文件夹。相当标准的东西。 因为我正试图扩展到能够使用套接字(请不要教我在 PHP 中使用套接字......放手吧!)所以我使用了 Dreamhost,它允许一个人代理 node.js 应用程序通过一个端口。例如。端口 xxxx 最终位于网站 url/您选择的任何文件夹/

好的,所以在我的 node.js 中,我使用的是 express。现在在快递中,您可以非常容易地指定路由。出于一些奇怪的原因,我懒得真正找出原因,如果你知道请赐教……我不得不在路由中加上双斜杠,就像这样“//whateverroute/”。我正在学习的所有示例都使用单个正斜杠。例如“/whateverroute/”,但这不起作用。如果您知道原因,请告诉我们。因此,在我弄清楚这一点之前,我实际上无法正确路由任何东西,因此必须在末尾使用带有端口号的 url。当然这会弄乱https。例如,https://www.theurl.com:xxxx 不安全,因为 node.js 应用程序没有运行 https res req 服务器。实际上我确实设置了 https 节点服务器,并认为这是解决问题的方法。

所以这个奇怪问题的解决方案是 node.js 路由。当然,它非常复杂,因为,嘿,当你从谷歌学习而不是真正了解你确切设置的人时,生活就是这样。

有趣的是,我无法忍受 node.js。我可以看到使用它的好处。但对于我正在做的简单的事情来说,这似乎是一件很痛苦的事情。我现在也发现了电话/差距,所以 php 对于我想做的事情实际上是可以的。好的,所以我通过 AJAX 请求多次访问服务器,但它现在正在处理几百个用户,当它达到 10'000 标记时,网站可能无法很好地工作,我应该赚到足够的钱来获得一个真正的 node.js 程序员可以从中学习......希望。

我非常感谢大家的帮助。

【讨论】:

  • app.get('/',function(req, res) { 必须改为 app.get('//',function(req, res) { 我不能告诉你为什么。这纯粹是侥幸我试过了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2017-11-04
  • 2014-09-14
相关资源
最近更新 更多