node.js详解Http服务器

概念:Node.js提供了http模块。其中封装了一个高效的HTTP服务器和一个建议的HTTP客户端。
   http.server是一个基于事件的HTTP服务器。内部有C++实现。接口由JavaScript封装。
            http.request则是一个HTTP客户端工具。用户向服务器发送请求。

一、HTTP服务器

http.Server实现的,它提供了一套封装级别很低的API,仅仅是流控制和简单的解析,所有的高层功能都需要通过它的接口
app.js案例
//引入模块
var http=require('http')
//创建服务
var server=http.createServer(function(req,res){//相当于action都在这里定义//响应头res.writeHead(200,{'Content-Type':'text/html'});//相应内容res.write('<h1>Node.js</h1>');//结束响应res.end('<p>PCAT</p>');
//监听端口
})
server.listen(3000);
server.on('close',function(){console.log('server is close');
})
console.log('HTTP server is listening at port 3000.');


代码分析:
http.createServer创建了一个http.Server的实例,将一个函数作为HTTP请求处理函数。这个函数接受两个参数,请求对象req和相应对象的res。res显式写入了响应代码200(表示请求成功),指定相应头,写入响应体。调用end结束并发送。该实例调用listen函数,启动服务器并监听3000端口。

           1.http.Server的事件

http.Server是一个基于事件的HTTP服务器,所有请求都被封装到独立的事件,开发者只要对它的事件编写相应函数可实现HTTP服务器的所有功能,它继承与EventEmitter,提供了以下事件:
   request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别是http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息。
connection:当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket的实例(底层协议对象)。
close:当服务器关闭时,该事件被触发。
除此之外还有checkContinue、upgrade、clientError事件。
最常用和关心的是:request事件,http提供了一个捷径,http.createServer([requestListener])
显式实现方法:
案例:server.js
var http=require('http');
var server=new http.Server();
server.on('request',function(req,res){res.writeHead(200,{'Content-Type':'text/html'});res.write('<h1>we are pcat</h1>');res.end("<p>I'm marico.</p>");
});
server.listen(3000);


            2.http.ServerRequest请求的信息

此对象是后端开发者最关注的内容,它一般由http.Server的request事件发送,作为第一个参数传递,通常简写成request或req。
HTTP请求分为两部分:请求头和请求体。,请求内容短的直接在请求头解析完成后立即读取,而请求体可能相对较长,需要一定的时间传输,因此提供了3个事件用于控制请求体传输。
   (1)data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。
                (2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
(3)close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close
ServerReuqest的属性
complete:客户端请求是否已经发送完成
httpVersion    HTTP协议版本,通常是1.0或1.1
method        HTTP请求方法,如:GET,POST
url                原始的请求路径,例如/pc/getUser或/user?name=marico
headers       HTTP请求头
trailers       HTTP请求尾(不常见)
connection              当前HTTP连接套接字,为net.Socket的实例
socket                   connection属性的别名
client            client属性的别名

            3.获取GET请求内容

由于GET请求直接被嵌入在路径中,URL完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET的参数,Nodejs的url模块中的parse函数提供了这个功能
案例:get.js
//引入模块
var http=require('http');
var urls=require('url');
var util=require('util');
//创建服务
http.createServer(function(req,res){res.writeHead(200,{'Content-Type':'text/plain'});//解析并打成字符串形式返回给客户端res.end(util.inspect(urls.parse(req.url,true)));
}).listen(3000);


             4.获取POST请求内容

POST请求的内容全部都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。恶意的POST请求会大大消耗服务器的资源。所以Nodejs是不会解析请求体,当你需要的时候,需要手动来做。
post.js
var http=require('http');
var querystring=require('querystring');
var util=require('util');
http.createServer(function(req,res){var post='技术共享CSDN';//注册data事件监听函数,每当接受请求体的数据req.on('data',function(chunk){post+=chunk;});req.on('end',function(){//解析成真正的post为真正的post请求格式//相当于Ext.decode()post=querystring.parse(post);//向前端返回res.end(util.inspect(post));});
}).listen(3000);


              5.http.ServerResponse返回给客户端的信息

决定了用户最终能到的结果,它是由http.Server的request事件发送的,作为第二个参数传递。一般为response或res
主要的三个函数:
response.writeHead(statusCode,[headers]):向请求的客户端发送响应头。
statusCode是HTTP的状态码,如200为成功,404未找到等。
headers是一个类似关联数组的对象,表示响应头的每个属性。
response.write(data,[encoding]) 向请求客户端发送相应内容,data是buffer或字符串,encoding为编码
response.end([data],[encoding]) 结束响应,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++面试(六)

二. 面试题 1.自我介绍 2.TCP和UDP的区别 3.简述下项目的流程

node.js http客户端

一、http模块提供了两个函数http.request和http.get&#xff0c;功能是作为客户端向HTTP服务器发起请求。 Ext.Ajax.request({},function(response))1.http.request(options,callback)发起HTTP请求&#xff0c;接受两个参数&#xff0c;option是一个类似关联数组的对象&#xf…

C++编程日记

1、操作符“ << ”和 “ >> ” 重载必须以内联方式重载&#xff0c;否则编译时报错&#xff0c;原因暂时不详 &#xff01; 2、int** 可以用于动态创建二维数组 &#xff1b; 3、数组定义必须用常量&#xff0c;不可用变量 &#xff01;

CDH kerberos 认证,安全认证

环境centos 7.4 安装KDC服务 yum -y install krb5-server krb5-libs krb5-auth-dialog krb5-workstation 修改配置文件 vi /etc/krb5.conf 默认如下 修改为 # Configuration snippets may be placed in this directory as well includedir /etc/krb5.conf.d/[logging]default…

虚拟继承和虚表

普通继承和虚拟继承类的大小变化&#xff1a; 普通继承&#xff1a; 虚拟继承&#xff1a; 类A和类B大小为&#xff1a; 由此可见&#xff1a;1、类中静态成员不会影…

node.js Express框架入门

一、为什么要用Express框架&#xff1f; Node.js由于不需要另外的HTTP服务器&#xff0c;因此减少了一层抽象&#xff0c;给性能带了不少的提升&#xff0c;同时也因此提高了开发难度&#xff0c;实现一个POST数据的表单&#xff0c;例如&#xff1a;<form><input typ…

Kerberos 基本命令 - 持续更新

授权添加yarn账户 [rootxxx ~]# kadmin.local Authenticating as principal cloudera-scm/adminJAST.COM with password. kadmin.local: addprinc yarnJAST.COM WARNING: no policy specified for yarnJAST.COM; defaulting to no policy Enter password for principal &quo…

equal_range

equal_range 是C STL中的一种二分查找的算法&#xff0c;试图在已排序的[first,last)中寻找value&#xff0c;它返回一对迭代器i和j&#xff0c;其中i是在不破坏次序的前提下&#xff0c;value可插入的第一个位置&#xff08;亦即lower_bound&#xff09;&#xff0c;j则是在不…

Kerberos 下运行spark 报错 Requested user hdfs is not whitelisted and has id 995,which is below the minimu

异常如下 main : run as user is hdfs main : requested yarn user is hdfs Requested user hdfs is not whitelisted and has id 995,which is below the minimum allowed 1000 问题原因&#xff1a;是由于Yarn限制了用户id小于1000的用户提交作业&#xff1b; 解决方法&a…

node.js工程的结构

我们使用express生成了package.json&#xff0c;它只产生了javascript的app.js和routes/index.js。模版引擎ejs有文件index.ejs&#xff0c;此外还有样式表style.css。12讲问题&#xff1a;创建工程时候一直使用jade。要求用ejs一、app.js 工程的入口。 分析代码&#xff1a;/*…

C++面试(七)

1、 谈谈你做过的项目&#xff0c;你主要负责哪个模块&#xff0c;代码量是多大&#xff08;除去VC自动生成的那些代码&#xff09; 2、 参与项目的人数是多少&#xff1f; 5、 谈谈你对C三个特点的理解&#xff08;简单描述一下&#xff09;。 6、 为什么要封装&#xff0c;如…

kerberos 下运行spark 报错 Requested user hdfs is banned

启动运行报错 main : run as user is hdfs main : requested yarn user is hdfs Requested user hdfs is bannedFailing this attempt. Failing the application.ApplicationMaster host: N/AApplicationMaster RPC port: -1queue: root.defaultstart time: 1565170753121fina…

node.js路由控制

一、工作原理 当通过浏览器访问app.js建立的服务器时&#xff0c;会看到一个简单的页面&#xff0c;实际上它已经完成了许多透明的工作&#xff0c;当访问http://localhost:3000&#xff0c;浏览器会向服务器发送请求&#xff0c;包括请求的方法、路径、HTTP协议版本和请求头信…

C、C++和MFC中文件的操作

对文件读写的三种方法1.C中FILE *pFilefopen("1.txt","w");fwrite(" http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile ");//fseek(pFile,0,SEEK_SET);//fwrite("ftp:",1,strlen("ftp:"),pF…

spark 提交至yarn异常超时 Client cannot authenticate via:[TOKEN, KERBEROS]

spark-cluster提交任务&#xff0c;提示 exit code :10 异常&#xff0c;具体需要到容器日志中去查看 19/08/07 18:09:24 INFO yarn.Client: client token: N/Adiagnostics: Application application_1565171057576_0008 failed 2 times due to AM Container for appattempt_…

node.js模块引擎

一、什么是模版引擎 模版引擎是一个从页面模版根据一定的规则生成HTML的工具&#xff0c;PHP首发&#xff0c;随后出现了ASP、JSP都沿用这个模式&#xff0c;即建立一个HTML页面模版&#xff0c;插入可执行的代码。运行时动态生成HTML。缺点&#xff1a; 页面功能逻辑与页面布局…

勤学如春起之苗,不见其增,日有所长!

“工作三年&#xff0c;并不等于拥有三年的工作经验。”这句话告诉我们每天都要思考自己当天所遇到的问题&#xff0c;记录下来&#xff0c;并且思考这个问题的解决办法&#xff0c;每一周或两周总结这些问题和解决办法&#xff0c;归纳思考问题根源&#xff0c;学习解决问题的…

HBase ACL管理 Hbase 权限管理

场景&#xff1a;hadoop集群已经进行kerberos认证 启动Hbase相关配置Hbase权限分为以下五种&#xff1a;Read(R) : 可以读取给定范围内数据的权限 Write(W) : 可以在给定范围内写数据 Executor(X) : 可以在指定表执行Endpoints类型的协处理 Create(C) : 可以在给定范围内创建和…

node.js ejs的视图模块引擎

一、版本升级 Express从2.0升级到3.0,将ejs的用法忽略&#xff0c;改为用户自定义形式。引入ejs/index.js的模块&#xff0c;来支持ejs的模版引擎二、引入引擎的模块&#xff0c;然后在app中调用engine函数改造ejs引擎 app.engine(ejs, engine);将layout.ejs设置成默认的布局模…

文本文件和二进制文件的区别

广义的二进制文件即指文件&#xff0c;由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中&#xff0c;通常在文本文件最后一行放置文件结束标志。文本文件的编码基…