node如何讓一個端口同時支持https與http

var net = require('net');
var http = require('http');
var https = require('https');
var fs = require('fs');

var httpPort = 3345;
var httpsPort = 3346;

var server = http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('hello world!');
}).listen(httpPort);

var options = {
  key: fs.readFileSync('./cakey.pem'),
  cert: fs.readFileSync('./cacert.pem')
};

var sserver = https.createServer(options, function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('secured hello world');
}).listen(httpsPort);

net.createServer(function(socket){
    socket.once('data', function(buf){
        console.log(buf[0]);
        // https數據流的第一位是十六進制「16」,轉換成十進制就是22
        var address = buf[0] === 22 ? httpsPort : httpPort;
        //建立一個指向https或http服務器的連接
        var proxy = net.createConnection(address, function() {
            proxy.write(buf);
            //反向代理的過程,tcp接受的數據交給代理連接,代理連接服務器端返回數據交由socket返回給客戶端
            socket.pipe(proxy).pipe(socket);
        });
        
        
        proxy.on('error', function(err) {
            console.log(err);
        });
    });
    
    socket.on('error', function(err) {
        console.log(err);
    });
}).listen(3344);

摘錄來源:http://www.cnblogs.com/dojo-lzz/p/5479870.htmlhtml

相關文章
相關標籤/搜索