簡體   English   中英

Socket.io和Express,Express應用程序如何知道要監聽的端口?

[英]Socket.io with Express, how does express app know what port to listen on?

我對nodejs非常陌生,對socket.io和express非常陌生。 我有一些可以正常工作的代碼,但是很難確切了解它為什么工作。

我對以下代碼的問題是Express應用程序如何知道在端口80上偵聽? 有一個server.listen。 但是代碼中沒有app.listen。 但是app.post()很容易接受發布的數據。

請考慮以下代碼

var https = require('https');
var url = require('url');
var fs = require('fs');
var bodyParser = require('body-parser');
var express = require('express');
var app = express();
//var io = require('socket.io');
var zlib = require('zlib');

app.use(bodyParser.urlencoded({extended: true }));

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


var serverPort = 80;
var server = https.createServer(options, app);
var io = require('socket.io')(server);


// log when the server is ready
server.listen(serverPort, function() {
    console.log('Web socket server up and running at port %s', serverPort);
    // this prints 80, as expected
});


app.post('/api', function (req, res) {
    // working code is in here that receives the post variables and responds
}

使用Express, app對象只是某些HTTP服務器的請求處理程序。 如果調用app.listen() ,則app對象將為您創建一個http服務器。 但是,如果您創建了自己的http服務器(您的代碼示例就是這樣做的),則使用以下代碼行, app對象將成為該服務器上的請求偵聽器:

var server = https.createServer(options, app);

這將創建http服務器,並將app注冊為請求偵聽器(這樣它將看到所有傳入的請求)。 這樣,Express應用程序對象便可以將向其注冊的路由處理為服務器路由,例如app.get(...)app.post(...)

並且,Express的端口是http服務器的端口,因此它是創建http服務器時使用的端口。 在這里重要的是要了解Express不是它自己的服務器。 它只是某些HTTP服務器的請求偵聽器。

在您的代碼示例中,您的http服務器設置為端口80,因此該端口將被使用,並且Express被注冊為該端口上所有這些傳入http請求的請求處理程序。


如果查看app.listen()源代碼 ,則會看到以下內容:

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

.listen()就是創建一個以app對象為偵聽器的http服務器,然后在該新服務器上調用.listen()

該應用程序不必知道在哪個端口上監聽。 基本上, server是您的HTTP服務器綁定,它在您的示例中偵聽端口80。 var server = https.createServer(options, app); 然后告訴服務器在端口80上偵聽HTTP請求,並將其轉發到您的應用。 然后,該應用程序執行路由工作,將您用app.post(...)分隔的功能鏈接到特定的請求URL(在此情況下為/ api)。

TL; DR:該應用程序無需偵聽,因為服務器是與外部的唯一通信接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM