如何将我的脚本socket.io修改为https?

时间:2017-08-25 16:39:28

标签: javascript sockets websocket socket.io

我是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的文件夹名称

还有什么必须修改?

1 个答案:

答案 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'})
})