让Socket.io与新的SSL加密网站一起使用

时间:2017-03-16 01:14:36

标签: node.js ssl encryption https socket.io

很抱歉,如果我错过了一些信息,这是我在stackoverflow上的第一篇文章。

我的网站上有定期的http请求,但今天我已经将SSL加密添加到我的网站,因为我已经听说过它会吸引更多流量到我的网站,但是我已经在我的网站上添加了SSL我从socket.io收到错误:" ERR_CONNECTION_CLOSED"。

编辑:另一个重要的注意事项是,当我用http而不是htttps键入url时,套接字连接到端口。

这是服务器端用于连接端口的内容: var io = require(' socket.io')(4002);

这是客户端用于连接端口的内容:

var HOST =":4002&#34 ;; SOCKET = io(HOST);

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用secure set为true的连接。

 var socket = io.connect('https://localhost', {secure: true});<br>

你也可以这样做:让你的主页加载普通的http,然后当浏览器将协议升级到websockets,然后升级到https。

答案 1 :(得分:0)

如果我从之前的故障排除中正确回想起来,客户端函数io()必须不带参数(在这种情况下,它会连接到与加载包含网页相同的原点,或者必须传递实际的URL)

所以,当你这样做时:

var HOST = ":4002";   
io(HOST);
你正在做的事情:

io(":4002");

这不是它理解的形式。以下是一些可行的表格:

io();                        // connect to same host and port as the containing webpage
io("https://somehost:4002");  // connect to specific host and port

io()的具体文档是here

io(url[, options])

url (String) 
options (Object) 
Returns Socket

如果它显示url,则需要一个格式化为URL的实际网址。

要创建用于socket.io的https服务器,首先创建服务器,然后将服务器传递给socket.io,如下所示:

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('agent2-key.pem'),
  cert: fs.readFileSync('agent2-cert.pem')
};

// create server and start it
const server = https.createServer(options).listen(4002);

// attach socket.io to your server
const io = require('socket.io')(server);

// attach event handlers to socket.io
io.on('connection', ....);

有关创建https服务器的详细信息,请参阅socket.io https documentation

您可以监听并记录服务器端可能发生的错误,如下所示:

server.on('clientError', (err, socket) => {
    console.log("clientError", err);
}).on('error', err => {
    console.log("serverError", err);
});