一个很简单的Nodejs问题

一个很简单的Nodejs问题

var http = require(“http”);

http.createServer(function(request, response) { response.writeHead(200, {“Content-Type”: “text/plain”}); response.write(“Hello World”); response.end(); }).listen(8888);

上面这段代码写在index.JS 里是不是表示每次有一个用户来访问都会createServer 生成一个http服务器,这样很多人来访问就会有很多服务器产生。但是像appach 就只有一个服务器。node这样只不是很浪费资源。


15 回复

你提到的代码确实是一个简单的 Node.js HTTP 服务器实现,但并不意味着每次有用户访问时都会创建一个新的 HTTP 服务器。实际上,Node.js 是一个基于事件驱动、非阻塞 I/O 的运行环境,它能够高效地处理并发请求,而不需要为每个连接创建新的服务器实例。

让我们详细分析一下这段代码:

var http = require("http");

http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
}).listen(8888);

解释

  1. 引入 http 模块

    var http = require("http");
    

    这行代码引入了 Node.js 内置的 http 模块,该模块提供了创建 HTTP 服务器的功能。

  2. 创建 HTTP 服务器

    http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Hello World");
        response.end();
    }).listen(8888);
    
    • http.createServer() 方法用于创建一个新的 HTTP 服务器。这个方法接受一个回调函数作为参数,该函数会在每次接收到 HTTP 请求时被调用。
    • 回调函数接收两个参数:requestresponserequest 表示客户端发送的请求对象,response 则是服务器端用来响应客户端的对象。
    • 在回调函数内部,我们设置了响应的状态码(200 表示成功),设置响应头(Content-Type 设置为 text/plain),然后写入响应体(“Hello World”),最后结束响应(response.end())。
    • .listen(8888) 方法用于启动服务器并监听指定端口(这里是 8888 端口)。

为什么不会频繁创建新服务器?

Node.js 使用事件循环机制来处理请求,这意味着服务器只会创建一次,并且会持续运行以处理所有传入的请求。每次有新的请求到达时,事件循环会触发回调函数,而不是每次都创建新的服务器实例。这使得 Node.js 能够高效地处理大量并发请求,而不像 Apache 那样为每个请求创建新的进程或线程,从而节约资源。

结论

因此,你提到的代码并不会导致每次有用户访问时都创建新的 HTTP 服务器。相反,它会创建一个长期运行的服务器,持续监听端口 8888 并处理所有传入的请求。这种设计使得 Node.js 在处理高并发请求时具有显著的优势。


不要写这么含糊的标题啊啊a啊a… 拼写有错, 代码没高亮… 新用户来访问, 新生成对应的数据来相应请求是都要做的 Node 用的是事件循环, Apache 是开子进程, 不那么耗资源

单线程啊…

要验证这个很简单.你写个 全局count 看一下count,访问一次是不是递增的…

以上代码等价于

var http = require(“http”); var server = http.createServer(); server.listen(6001); server.on(‘connection’, function(){ response.writeHead(200, {“Content-Type”: “text/plain”}); response.write(“Hello World”); response.end();
})

每次有访问过来,只会触发’connection’里面的代码。

createServer()参数如果是function,node会自动监听’connection’。

我的意思是,外部的请求都是针对文件的,比如客户访问了index.JS, 然后文件中var server= http.createServer();就等于实例化了一个sever对象,该对象是注册了事件监听器的,它监听6001 端口的connection事件。那么很多客户来访问index.JS 页面,是不是都会重复实例化sever对象还是公用这个之前生成的对象,可不可以写个代码测试一下

个人感觉楼上几个回复都已经很清楚了…

你想一下,单线程的玩意,你的对象一旦创建,就一直活在内存里面,无论你怎么访问,还是这个对象,这个与apache过来一个访问创建一个线程不同的.

这个也是nodejs 的特性,没有这个特性的话,干嘛要选择node …

要验证很简单.我们只需在http 创建一个属性,如果是重复实例化的count 应该会一直输出 1,共用的话,就会不断递增…

var http = require("http");

http.count = 0; http.createServer(function(request, response) { console.log(++http.count); response.writeHead(200, {“Content-Type”: “text/plain”}); response.write(“Hello World”); response.end(); }).listen(8888);

你自己跑一下这个例子吧…

嗯,谢谢。一定好好学习node

你个的代码怎么会每次+2而不是+1

…你是本机并且用的是ip 访问吧… 例如局域网: 192.168.1.100:8888 这样访问的话就会触发两次…

如果是用localhost:8888 就是一次…

至于为什么…补一下网络基础吧…

+2可能是因为很多浏览器可能会访问一个/favicon.ico的图标 就是地址栏前面显示的那个。

另:createServer是启动应用的时候只调用一次,就是你调用 node index.js的时候调用。

var http = require(“http”);

function onRequest(request, response) { response.writeHead(200, {“Content-Type”: “text/plain”}); response.write(“Hello World”); response.end(); } http.createServer(onRequest).listen(8888); console.log(“create a server instance”);

这样子运行一下就知道,每次运行node index.js的时候会输出 create a server instance ,每次浏览器访问不会输出。

写的不错

外部请求不是针对文件的,而是针对端口,node index.js(只执行一次,所以createServer也只会执行一次),会监听端口的请求,如果有请求进来,node会使用你传递给createServer的这个function处理这个请求,在这个函数中实现如何响应这个请求。

呵呵你问的这个问题够奇葩的,用户就是访问文件index.JS也不是直接执行js代码吧,也是要通过http服务器来访问的吧,也要通过http.createServer来访问吧,这个可不是浏览器端src="index.js"就加载一次了,服务器的任何文件都是http服务来进行的,说了这么多应该明白了吧

你的理解有一些偏差。在这段代码中,http.createServer() 并不是每次有用户访问时都创建一个新的 HTTP 服务器。实际上,它只创建了一个 HTTP 服务器实例,并且这个服务器实例会在端口 8888 上监听请求。

当你运行 node index.js 时,Node.js 会启动一个 HTTP 服务器,该服务器会一直运行,直到你手动停止它。当有用户访问时,服务器会处理请求并发送响应,而不是重新创建一个新的服务器实例。

以下是简化版的解释:

  1. 服务器创建http.createServer() 创建了一个 HTTP 服务器实例,但并不会立即开始监听。
  2. 监听端口.listen(8888) 使得服务器开始在端口 8888 上监听传入的连接。
  3. 请求处理:当有请求到达时,服务器会调用传给 .createServer() 的回调函数来处理请求。

示例代码:

const http = require('http');

// 创建 HTTP 服务器实例
const server = http.createServer((request, response) => {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
});

// 监听端口 8888
server.listen(8888, () => {
    console.log('Server is running on port 8888');
});

这样,服务器只会创建一次,并且会持续运行,直到你停止 Node.js 进程。这与 Apache 不同,Apache 可以配置为使用多个进程或线程来处理请求,而 Node.js 是单线程事件驱动的,通常情况下不需要为每个请求创建新的服务器实例。

回到顶部