当前位置: 首页 > news >正文

酒店网站建设的构思网址域名是什么

酒店网站建设的构思,网址域名是什么,如何生成短链接,四川建设网地址在哪深入学习http模块 前言http一个Web服务器项目创建代码运行代码解析 Server属性#xff1a;keepAlive属性#xff1a;keepAliveTimeout属性#xff1a;maxHeaderSize属性#xff1a;requestTimeout属性#xff1a;maxRequestsPerSocket方法#xff1a;close()方法#xf… 深入学习http模块 前言http一个Web服务器项目创建代码运行代码解析 Server属性keepAlive属性keepAliveTimeout属性maxHeaderSize属性requestTimeout属性maxRequestsPerSocket方法close()方法closeAllConnections()方法setTimeout()方法listen()事件connection事件dropRequest事件request 案例ClientRequest创建ClientRequest对象实例方法事件监听 ServerResponse属性方法 IncomingMessage其他属性http.METHODShttp.STATUS_CODES 其他 前言 本章详细介绍了http模块的各部分概念和用途包括创建一个简单的 Web 服务器、配置服务器属性、处理客户端请求以及响应客户端。 在学习本章之前你最好具有一些前置的基础知识如计算机网络知识、Ajax或者Fetch请求、跨域相关知识等。 http 一个Web服务器 项目创建 const http require(node:http);const hostname 127.0.0.1; const port 3000;const server http.createServer((req, res) {res.statusCode 200;res.setHeader(Content-Type, text/plain);res.end(Hello, World!\n); });server.listen(port, hostname, () {console.log(Server running at http://${hostname}:${port}/); });这是官方给出的一个案例我们创建一个目录为node-server并创建index.js文件将上面内容写入。 通过npm init创建一个package.json配置文件根据提示填入相应的配置信息。 在package.json中找到scripts配置写入start: node ./index.js。 代码运行 我们可以通过node index.js的方式运行上面的文件但是为了方便操作我们写入了npm命令脚本脚本的内容就是node index.js这样我们只需要运行start命令即可 npm run start运行之后命令行会输出 我们的Web服务就启动成功了在浏览器打开 http://127.0.0.1:3000/就可以看到Hello, World!。 代码解析 我们来简单解析一下上面的代码如果你有一定的Nodejs基础这段代码是可以看得懂的 导入http模块定义主机名和端口号创建Web服务并在回调中设置响应状态、响应头和响应体监听设定的端口号并在服务启动成功之后给出提示信息。 代码的核心在于http.createServer和server.listen它们分别用于创建服务和监听端口号。 我们对Web服务器的要求也很简单能够接收客户端请求并做出响应即可这段代码正好符合我们的要求。 不过这段代码有点问题比如 所有发送到localhost:3000的请求无论路径和参数是什么它总会返回HelloWorld!如果发生异常如大并发、网络缓慢、服务端出错等它无法做出“人性化”反馈。 第一点是我们必须要考虑的问题我们希望不同的请求路径响应不同的结果 第二点对于普通项目来说需要考虑的场景并不是很多但是我们也希望能够做出适当配置让项目达到一个较好的运行状态。 Server Server类用于创建一个http实例。 官方给出了http.server相关的方法和属性以及“事件”我们只需要学会常用的配置即可。 你可以将配置写在一个options对象中并作为http.createServer的第一个参数传入也可以将配置作为http实例的属性直接修改。 一般我们用第一种方式为服务设置通用配置信息而第二种方式用于定制化项目配置根据自己需要选择。 const server http.createServer({ ...options }, () {});属性keepAlive 我们知道http的无状态的服务器无法知晓客户端状态客户端每发送一次请求客户端都会建立三次握手SYN, SYN-ACK, ACK这会消耗时间和资源。 假设你的官网加载了很多资源图片、文本、视频…服务器的握手会很占用时间有没有一种可能我们让服务器在某个设定的时间段内在客户端和服务器之间保持持久连接从而允许在同一个 TCP 连接上发送多个 HTTP 请求和接收响应而不是为每个请求都打开和关闭一个新的连接。 这种做法既可以保证连接的安全性也极大提升了“高并发”下的加载速度。 在HTTP/1.1中keep-alive是默认行为不需要显式设置你可以在一些请求中看到相关的信息 单个请求的KeepAlive并没有什么意义我们会在学习完其他属性之后进行测试。 属性keepAliveTimeout 为了“高并发”下的请求效率浏览器默认启用了KeepAlive我们不考虑其他非浏览器情况。 这里又会产生一个问题开启KeepAlive之后服务器需要分配一部分内存来管理连接如果瞬时用户量很大可能会造成服务器崩溃。 为了解决这个问题我们约定给KeepAlive一个时长在这个时长范围内保持链接超过时长则断开这个时长默认为5000ms当然你也可以通过设置keepAliveTimeout来自定义时长它的单位为毫秒当客户端发送请求在这个范围内时会一直使用同一个连接。 连接会自动延长当下一次请求触发之后会自动顺延时长。 属性maxHeaderSize 请求头的最大长度没什么特殊的地方默认长度为16384也就是16k。 属性requestTimeout 请求超时时长默认是300000ms也就是300秒可以应付大部分需求如果你需要上传大问题可以在指定的请求内修改并覆盖。 属性maxRequestsPerSocket 每次连接的最大请求数量默认为0表示不限制这个属性需要放在server实例上配置 server.maxRequestsPerSocket 3;方法close() 关闭服务器本身使其停止监听新的连接请求。 server.close(() {console.log(server on port 8000 closed successfully); });方法closeAllConnections() 关闭所有连接到此服务器的连接包括那些正在处理请求或等待响应的连接以及空闲连接。 我们一般先调用server.close再调用server.closeAllConnections()这样既能够保证清晰的逻辑顺序也能确保服务被正确关闭。 server.closeAllConnections();方法setTimeout() 除了在创建服务时配置的timeout之外还可以使用server.setTimeout方法进行设置。 // 设置连接超时时间为 5000 毫秒5 秒 server.setTimeout(5000, () {console.log(A connection was closed due to inactivity.); });方法listen() 开始监听特定端口或路径你可以监听多个端口来实现不同的项目。 server.listen(3344, () {console.log(Server running at http://localhost:${3344}/); });server.listen(1122, () {console.log(Server running at http://localhost:${1122}/); });事件connection 当有新的 TCP 连接时‘connection’ 事件被触发我们可以用connection时间来查看相关信息。 server.on(connection, (socket) {console.log(Connection connected!, socket.localAddress, socket.localPort, socket.remoteAddress, socket.remotePort); });事件dropRequest 当连接的请求超过maxRequestsPerSocket的阈值时连接会删除新的请求并触发dropRequest不过在浏览器端并不会发生该事件而是会将请求分成多批次进行响应。 事件request 每当有一个请求都会触发该事件一个连接中的多个请求都会触发一次。 server.on(request, (request) {console.log(Received request, request.url); });案例 我们来写一个案例测试上面的配置 const http require(node:http);const hostname 127.0.0.1; const port 3000;const server http.createServer({keepAlive: true,keepAliveTimeout: 1000 },(req, res) {res.setHeader(Access-Control-Allow-Origin, *);res.setHeader(Access-Control-Allow-Methods, *);res.setHeader(access-control-allow-headers, *);res.statusCode 200;res.setHeader(Content-Type, text/plain);res.end(Hello, World!\n); }); server.maxRequestsPerSocket 3; server.on(connection, (socket) {console.log(Connection connected!, socket.localAddress, socket.localPort, socket.remoteAddress, socket.remotePort); }); server.on(request, (request) {console.log(Received request, request.url); }); server.listen(port, hostname, () {console.log(Server running at http://${hostname}:${port}/); });我们启用了KeepAlive并设置1000毫秒的持续时长同时设置maxRequestsPerSocket为3表示一个连接最多传递3个请求。 !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head bodybutton onclickbutton()点击/buttonscriptfunction button() {Promise.all([request(),request(),request(),request(),request()])}function request(url http://127.0.0.1:3000){fetch(url, {method: get,keepalive: true,})}/script /body /html我们在html中同时发送五个请求我们来尝试运行注意由于index.html并没有通过Nodejs的服务访问因此存在跨域我们在代码中做了简单处理。 当我们点击按钮浏览器会发出五次请求由于限定了maxRequestsPerSocket的大小connection事件会被触发两次。 我们修改maxRequestsPerSocket为0然后快速点击按钮 server.maxRequestsPerSocket 0;设置为0表示不限制单个连接的请求数量由于点击速度在1秒内因此除了第一次后面每次点击无需再次建立连接 在你最后一次点击之后停留1秒之后再次点击则会再次触发connection事件我们设置的超时时间为1秒超过一秒原来的连接会中断并建立新链接。 ClientRequest ClientRequest是一个非常重要的类用于表示一个正在进行中的 HTTP 客户端请求。 通俗一点就是Nodejs向其它服务器发出请求时所创建的请求对象。 我们学习它是为了更好地理解后面的请求对象。 创建ClientRequest对象 我们通常使用http.request()方法创建ClientRequest对象下面的是一个案例告诉你如何创建 const http require(http);const options {hostname: www.example.com,port: 80,path: /,method: GET };const req http.request(options, (res) {console.log(STATUS: ${res.statusCode});console.log(HEADERS: ${JSON.stringify(res.headers)});res.on(data, (chunk) {console.log(BODY: ${chunk});});res.on(end, () {console.log(No more data in response.);}); });req.on(error, (e) {console.error(problem with request: ${e.message}); });req.end();我们通过http.request向http://www.example.com发出了一个get请求并监听其回调。 回调函数接受一个参数这个参数称为响应对象类型为“IncomingMessage”在后面也会再次遇到。 实例方法 ClientRequest提供了多种方法来配置和发送请求我们可以用这些方法来定制化请求。 setHeader(name, value)设置请求头的单个字段。 req.setHeader(Content-Type, application/json);getHeader(name)获取请求头的单个字段的值。 const contentType req.getHeader(Content-Type);removeHeader(name)移除请求头的某个字段。 req.removeHeader(Content-Type);write(chunk[, encoding])将数据写入请求体get请求无效。 req.write({name: John Doe});end([data][, encoding][, callback])结束请求并发送数据如果你用过write则无需再添加参数。 req.end({email: john.doeexample.com});abort()终止请求。 req.abort(); // 立即终止请求setTimeout(timeout[, callback])设置请求的超时时间。 req.setTimeout(5000, () {console.log(Request timed out);req.abort(); });事件监听 我们可以通过监听事件在不同阶段做出一些操作。 ‘response’当接收到响应头时触发传递一个 http.IncomingMessage 对象作为参数。 req.on(response, (res) {console.log(STATUS: ${res.statusCode}); });‘socket’当为请求分配了一个 net.Socket 时触发。 req.on(socket, (socket) {console.log(Socket assigned.); });‘error’当请求过程中发生错误时触发。 req.on(error, (e) {console.error(problem with request: ${e.message}); });‘abort’当请求被终止时触发。 req.on(abort, () {console.log(Request aborted.); });‘timeout’当请求超时时触发。 req.on(timeout, () {console.log(Request timed out.);req.abort(); });在实际开发中我们一般会用第三方工具辅助开发但是最基本的原理也要学会这样才能应付出现的问题。 ServerResponse ServerResponse用于表示 HTTP 服务器的响应对象。每当 HTTP 服务器接收到请求时都会创建一个http.ServerResponse对象因此我们无需手动创建该对象。 你可能会有疑问 在上面的案例中 const req http.request(options, (res) {console.log(STATUS: ${res.statusCode});console.log(HEADERS: ${JSON.stringify(res.headers)});res.on(data, (chunk) {console.log(BODY: ${chunk});});res.on(end, () {console.log(No more data in response.);}); });通过http.request创建请求的第二个参数表示回调我们上面说了这个回调函数的参数类型是IncomingMessage按照我们正常的逻辑来说它应该是响应对象那为什么会是IncomingMessage呢 如果你问出了这样的疑问说明有思考我们需要区分一下场景。 上面说到了Server这是个服务器服务器接受请求发送响应 上面说到了ClientRequest这是个客户端工具用于请求服务器 现在说的ServerResponse这是个中介它在服务器叫ServerResponse当它被发送到客户端之后称为IncomingMessage因此很容易被迷惑。 如果再网上在Server的案例中有这样一段代码 server.on(request, (request) {console.log(Received request, request.url); });注意这里的request可不是ClientRequest它只是被我们碰巧命名为request为了区分可以将它改为req。 我们思考一下IncomingMessage叫“即将到来的消息”对于服务器来说发送过来的请求是“即将到来的消息”对于客户端来说发送过来的响应是“即将到来的消息”。我们要理清一下关系 客户端通过ClientRequest创建一个请求请求发送到服务器这个请求对象被包装变成Server的request事件的回调函数的参数称为IncomingMessage它用于获取请求信息Server的request事件的回调函数还接受第二个参数作为响应对象也就是上面所说的ServerResponse我们给ServerResponse进行配置之后返回给客户端客户端通过ClientRequest的回调响应请求拿到服务端发送回来的ServerResponse此时它也被称为IncomingMessage。 记住这个关系后面还会遇到。 属性 作为一个响应对象它会有下列常用属性 statusCode状态码statusMessage状态消息header响应头使用方法代替响应体 response.statusCode 200; response.setHeader(Content-Type, text/plain); response.end(Goodbye!);方法 setHeader(name, value)设置响应头的单个字段。getHeader(name)获取响应头的单个字段的值。removeHeader(name)移除响应头的某个字段。write(chunk[, encoding][, callback])向响应体写入数据块。writeHead(statusCode[, statusMessage][, headers])同时设置响应状态码、状态消息和响应头然后准备发送响应体。end([data][, encoding][, callback])结束响应过程并可选地发送数据块。 IncomingMessage IncomingMessage用于表示 HTTP 请求在服务器端或 HTTP 响应在客户端。它提供了访问请求/响应头和读取请求/响应体的接口。 在服务器端 由http.Server对象在接收到请求时自动创建并通过回调函数的第一个参数传递给开发者。 在客户端 由http.ClientRequest对象在接收到响应时自动创建并通过response事件传递给开发者。 这个对象的相关属性和方法其实在上面基本上都讲过了我们需要做的就是理清楚它在客户端与服务器之间具体的用途。 其他属性 http.METHODS 一个字符串数组列出来所有能被解析的请求方法。 http.STATUS_CODES 包含了所有标准 HTTP 状态码及其对应的描述性文本。 console.log(http.STATUS_CODES[200]); // 输出: OK console.log(http.STATUS_CODES[404]); // 输出: Not Found console.log(http.STATUS_CODES[500]); // 输出: Internal Server Error其他 通过上面的内容学习我们能够实现一个简单的http服务器它能够接收请求并做出响应同时能够根据请求的url和method做出简单的路由但是我们还有一些部分没有提到如参数的解析nodejs本身没有直接从body或者查询字符串提取数据的能力需要我们自己进行提取因此我们要在学完Buffer和Stream之后再来解析参数。
http://www.zqtcl.cn/news/935725/

相关文章:

  • 长沙网站建设软件wordpress加菜单
  • 网站建设教育板块wordpress $pagenow
  • 岳阳手机网站建设自己可以给公司做网站吗
  • 旅游网站建设目的关于建设网站的需求分析
  • 手机可以建立网站吗自己造网站
  • 厦门建网站哪家好手机编程网站
  • 网站搭建后台奥门网站建设
  • 电子商务网站免费模板展示型网站与营销型网站
  • 除了红动中国还有哪些设计网站宁波建网站哪家
  • 网站的建设费用预算策划书wdcp网站备份
  • 济南制作公司网站网站设计的实例
  • 网站建设需要的文案一个网站的后台怎么做
  • 电影网站建设模板营销方式都有哪些
  • 书店商城网站建设方案未央免费做网站
  • 北京房产网北京二手房企业网站seo方案案例
  • 大连品牌官网建站二级建造师最好的网站
  • python开发工具搜索引擎优化的英语简称
  • 做产品代理上哪个网站好东莞公司网上推广
  • 专业制作网站公司上海广告公司联系方式
  • 古交市网站建设公司四川省建设厅电子政务网站
  • 清河网站建设费用50万做网站
  • 怎么找网站的根目录平台类网站营销方案
  • 网站关键词 价格生成山西建设工程备案网站
  • 网站开发入哪个会计科目设计师自己的网站
  • php做网站界面代码定制网页设计报价
  • 重庆智能模板建站wordpress+widget+开发
  • vps网站空间时尚网站首页设计
  • 美容行业网站建设方案网站建设需求背景
  • 贵阳做网站找哪家好长沙部分风险区域调整
  • 设计网站 常用微信网站建设口碑好