express同一端口上使用HTTP和HTTPS

2020-12-16  本文已影响0人  陆遥远
let net = require('net');
let http = require('http');
let https = require('https');

exports.createServer = (opts, handler) => {
    let server = net.createServer(socket => {
        socket.once('data', buffer => {
            // Pause the socket
            socket.pause();
            // Determine if this is an HTTP(s) request
            let byte = buffer[0];
            let protocol;
            if (byte === 22) {
                protocol = 'https';
            } else if (32 < byte && byte < 127) {
                protocol = 'http';
            }
            let proxy = server[protocol];
            if (proxy) {
                // Push the buffer back onto the front of the data stream
                socket.unshift(buffer);
                // Emit the socket to the HTTP(s) server
                proxy.emit('connection', socket);
            };
            // As of NodeJS 10.x the socket must be 
            // resumed asynchronously or the socket
            // connection hangs, potentially crashing
            // the process. Prior to NodeJS 10.x
            // the socket may be resumed synchronously.
            process.nextTick(() => socket.resume());
        });
    });

    server.http = http.createServer(handler);
    server.https = https.createServer(opts, handler);
    return server;
};

-2. 创建app.js文件,文件内容如下:

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

//同步读取密钥和签名证书
var options = {
    key:fs.readFileSync('./keys/server.key','utf-8'),
    cert:fs.readFileSync('./keys/server.crt','utf-8')
};
var app = express();
var httpsServer = https.createServer(options,app);
var httpServer = http.createServer(app);

app.get('/',function(req,res,next){
    res.send('Hello Express+https');
});
//https监听3000端口
httpsServer.listen(3000);
//http监听3001端口
httpServer.listen(3001);

-3 启动node服务

   node app.js

-4. 测试

http://127.0.0.1:8080/ 接口可正常访问

https://127.0.0.1:8080/ 接口可正常访问

上一篇下一篇

猜你喜欢

热点阅读