2017-09-12 43 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連接邏輯更容易使用。