如何使用Node.js使HTTPS套接字IO工作
这让我非常沮丧!如何使用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"});
这怎么可能?
任何帮助,非常感谢。
您的服务器代码只创建一个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,因此如果未指定端口号,那么浏览器将尝试使用该端口号。
感谢您的回复Jfriend00 - 我现在已经解决了这个问题。我现在没有时间写出详细版本的解决方法,但是你是对的...我必须创建一个https服务器。我真正必须做的是在socket.io的单独端口上监听。我会实际制作一段视频,向像我这样的假人解释它,因为即使有很多关于这方面的信息......当我说的时候相信我,这些信息对假人来说并不好。但我有它的工作,并会尽快通过知识,我有时间:-) –
@FeelsUnique - 好吧,除非你想你的Web服务器是http和你的socket.io是https,没有技术上的原因, web服务器和socket.io不能在同一个端口上。到目前为止,您还没有描述任何需要单独端口的产品要求。 – jfriend00
@FeelsUnique - 这是否回答你的问题?如果是这样,您可以通过点击答案旁边的复选标记来向社区表明这一点,并且为了遵循正确的程序在计算器上获得一些声望点。 – jfriend00
好吧,这有点让人不好意思......我遇到的实际问题是因为以下原因。
如果你可以关注这个大声笑...
所以在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的帮助。
app.get('/',function(req,res){必须改为app.get('//',function(req,res){我不能告诉你为什么。 –
将路由从单个正斜杠更改为双精度后。我不再需要使用端口,而是可以使用url路径,所以var socket = io.connect('https://www.myurl:8001',{path:“/socket.io”});成为var socket = io.connect('https://www.myurl/theappfolder/',{path:“/socket.io”}); –