2017-11-17 145 views
0

这让我非常沮丧!如何使用Node.js使HTTPS套接字IO工作

我使用代理服务器,使得去myurl任何请求/ APP /用Node.js的在myurl回答:8001

我现在需要这个工作,通过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); 

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

这怎么可能?

任何帮助,非常感谢。

+0

将路由从单个正斜杠更改为双精度后。我不再需要使用端口,而是可以使用url路径,所以var socket = io.connect('https://www.myurl:8001',{path:“/socket.io”});成为var socket = io.connect('https://www.myurl/theappfolder/',{path:“/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数据结构的适当certificateinfo。代码示例为here

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

+0

感谢您的回复Jfriend00 - 我现在已经解决了这个问题。我现在没有时间写出详细版本的解决方法,但是你是对的...我必须创建一个https服务器。我真正必须做的是在socket.io的单独端口上监听。我会实际制作一段视频,向像我这样的假人解释它,因为即使有很多关于这方面的信息......当我说的时候相信我,这些信息对假人来说并不好。但我有它的工作,并会尽快通过知识,我有时间:-) –

+0

@FeelsUnique - 好吧,除非你想你的Web服务器是http和你的socket.io是https,没有技术上的原因, web服务器和socket.io不能在同一个端口上。到目前为止,您还没有描述任何需要单独端口的产品要求。 – jfriend00

+0

@FeelsUnique - 这是否回答你的问题?如果是这样,您可以通过点击答案旁边的复选标记来向社区表明这一点,并且为了遵循正确的程序在计算器上获得一些声望点。 – jfriend00

0

好吧,这有点让人不好意思......我遇到的实际问题是因为以下原因。

如果你可以关注这个大声笑...

所以在dreamhost中,它们允许你运行apache并以通常的方式提供内容。有这个/公共文件夹。相当标准的东西。 因为我试图分支到能够使用套接字(请不要告诉我使用套接字与PHP ...让它走吧!)所以我使用的是Dreamhost,它允许一个人代理一个node.js通过端口的应用程序。例如。端口xxxx结束在thewebsiteurl/whateverfolderyouchoose/

好,所以在我的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程序员希望从中学习....

我很感谢tho的帮助。

+0

app.get('/',function(req,res){必须改为app.get('//',function(req,res){我不能告诉你为什么。 –