2017-09-12 45 views
0

我正尝试使用websockets支持创建简单的https服务器。我有一些https服务器和websockets的功能代码,但都是独立的。不知道如何组合它。我更喜欢使用免费使用库(麻省理工学院,..)在node.js上使用websockets的Https服务器

我想能够提供http请求和websockets。

Https升级示例,但不知道如何处理升级后的websocket连接,作为我的第二个示例在下面这个。

connection. process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

var https = require('https'); 
var websocket = require('websocket'); 
var fs = require('fs'); 

var options = { 
    key:fs.readFileSync('./cert/server.key'), 
    cert:fs.readFileSync('./cert/server.crt') 
}; 

var server = https.createServer(
    options 
    , function(req,res) { 

    console.log('req'); 

    res.writeHeader(200, { 'Content-Type': 'text/plain' }); 
    res.write('test'); 
    res.end(); 
    } 
); 
server.on('upgrade', (req, socket, head) => { 

    console.log('upgrade '); 

    socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' + 
       'Upgrade: WebSocket\r\n' + 
       'Connection: Upgrade\r\n' + 
       '\r\n'); 

    socket.pipe(socket); 
}); 

server.listen(8080, '127.0.0.1',() => { 

    // make a request 
    const options = { 
    port: 8080, 
    hostname: '127.0.0.1', 
    headers: { 
     'Connection': 'Upgrade', 
     'Upgrade': 'websocket' 
    } 
    }; 

    const req = https.request(options); 
    req.end(); 

    req.on('upgrade', (res, socket, upgradeHead) => { 

    console.log('got upgraded!'); 

*** so what to do here *** 


    /* 
    socket.end(); 
    process.exit(0); 
    */ 
    }); 
}); 

这是功能性的websockets,但没有处理简单的http请求的可能性。

var https = require('https'); 
var ws = require('websocket').server; 
var fs = require('fs'); 

var options = { 
    key:fs.readFileSync('./cert/server.key'), 
    cert:fs.readFileSync('./cert/server.crt') 
}; 


var server = https.createServer(
     options 
, function(req,res) { 
     res.writeHeader(200); 
     res.end(); 
} 
); 

server.listen(8080); 


var wss = new ws({httpServer:server}); 

var connectionNumber=0; 
console.log('start '); 
wss.on('request',function(req){ 

     req.on('requestAccepted',function(conn){ 

       conn.on('message',function(msg){ 

         conn.send('test'); 
       }); 

       conn.on('close',function(msg){ 
       }); 

     }); 

     req.accept(null,req.origin); 
}); 

我正在寻找组合解决方案的功能实例,但没有任何运气。

回答

1

您可以对自签名证书(代码1006)产生wss连接问题。在这种情况下,您必须将您的证书添加到根CA(FirefoxChrome)。

// app.js 
'use strict' 
const https = require('https'); 
const fs = require('fs'); 
const ws = require('ws'); 

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

const index = fs.readFileSync('./index.html'); 

let server = https.createServer(options, (req, res) => { 
    res.writeHead(200); 
    res.end(index); 
}); 
server.addListener('upgrade', (req, res, head) => console.log('UPGRADE:', req.url)); 
server.on('error', (err) => console.error(err)); 
server.listen(8000,() => console.log('Https running on port 8000')); 

const wss = new ws.Server({server, path: '/echo'}); 
wss.on('connection', function connection(ws) { 
    ws.send('Hello'); 
    ws.on('message', (data) => ws.send('Receive: ' + data)); 
}); 

// index.html 
<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"/> 
</head> 
<body> 
<script> 
    var socket = new WebSocket('wss://127.0.0.1:8000/echo'); 
    socket.onopen =() => console.log('Connected') || setInterval(() => socket.send(new Date().toLocaleString()), 1000);  
    socket.onclose = (event) => console.log((event.wasClean) ? 'Disconnected' : 'Connection break: ' + (event.reason || event.code)); 
    socket.onmessage = (event) => console.log('DATA', event.data); 
    socket.onerror = (err) => console.error(err.message); 
</script> 
Press F12 to open console... 
</body> 
</html> 
+0

看起来好,谢谢。 – Adam

0

由于您使用的节点,我建议考虑看看Socket.io。比使用所有手动websocket连接逻辑更容易使用。