我是socket.io的新手,我想在我的网站上使用我的应用程序当前在HTTPS上运行,所以实际上我有我的服务器:
var http = require('http').createServer(server),
fs = require('fs'),
io = require('socket.io')(http);
function server(req, res){
fs.readFile('index.html',(err, data)=>{
if(err){
res.writeHead(500,{'Content-Type':'text/html'});
return res.end('<h1>Error</h1>');
} else {
res.writeHead(200,{'Content-Type':'text/html'});
return res.end(data,'utf-8');
}
})
}
http.listen(3000);
console.log("Running server");
io.on('connection', (socket)=>{
socket.emit("hello",{ message : 'Hello world'})
})
客户index.html:
<script src="/socket.io/socket.io.js"></script>
<script>
'use strict'
var io = io(),
d = document
io.on('hello', function(data){
console.log(data);
d.querySelector("#hello").innerHTML = data.message;
})
</script>
这在HTTP中运行良好但是如何为HTTPS修改它?
修改
根据node docs我更改了服务器脚本:
var http = require('https'),
fs = require('fs'),
io = require('socket.io')(http);
var options = {
key: fs.readFileSync('myprivkey.pem'),
cert: fs.readFileSync('mycert.pem')
};
http.createServer(options, (req,res)=>{
fs.readFile('index.html',(err, data)=>{
if(err){
res.writeHead(500,{'Content-Type':'text/html'});
return res.end('<h1>Error</h1>');
} else {
res.writeHead(200,{'Content-Type':'text/html'});
return res.end(data,'utf-8');
}
})
}).listen(3000);
console.log("Running server");
io.on('connection', (socket)=>{
socket.emit("hello",{ message : 'Hello world'})
})
我运行服务器并且没有显示错误但客户端无法正常工作,如果我在浏览器中运行mysite.com:3000/myapp,控制台说:'未捕获的SyntaxError:意外的令牌&lt; '和'未捕获的TypeError:io不是函数'。
如果我运行mysite.com/myapp控制台说:'获取www.mysite.com/socket.io/socket.io.js 404(未找到)'和'未捕获的TypeError:io不是函数'。
我想在运行mysite.com/myapp时运行,“myapp”是位于服务器脚本和客户端index.html的文件夹名称
还有什么必须修改?
答案 0 :(得分:0)
有两种方法可以满足您的要求。通常,在生产环境中,基于nodejs的服务器使用所谓的反向代理运行。这基本上是nginx或其他Web服务器坐在前面并传递网络请求节点需要关心。在这种情况下,反向代理通常处理事物的HTTPS端,而节点只需要处理http。
另一种方法是让节点处理https本身的TLS安全性。要做到这一点,你必须得到一个https证书(letsencrypt是一个很好的选择),并告诉你的服务器实例,如下所示:
var http = require('http').createServer(server),
fs = require('fs');
// Add https certificate
var crypto = require('crypto');
var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();
var credentials = crypto.createCredentials({key: privateKey, cert: certificate});
http.setSecure(credentials);
var io = require('socket.io')(http);
function server(req, res){
fs.readFile('index.html',(err, data)=>{
if(err){
res.writeHead(500,{'Content-Type':'text/html'});
return res.end('<h1>Error</h1>');
} else {
res.writeHead(200,{'Content-Type':'text/html'});
return res.end(data,'utf-8');
}
})
}
http.listen(3000);
console.log("Running server");
io.on('connection', (socket)=>{
socket.emit("hello",{ message : 'Hello world'})
})