NodeJs之初体验06—HTTP

在第一篇了解nodeJs的最后,我们用nodejs创建了一个简单的web服务,其引用的就是http模块,
所以,我们先起一个web服务

let http = require('http'); http.createServer(function(req,res){ res.writeHead(200,{'Content-Type':'text/plain'}); res.write("hi,平田君,加嘞个油~~~"); res.end(); }).listen(8080); console.log('server running at http://127.0.0.1:8080/');

然后我们运行后发现事情并没有那么简单:

NodeJs之初体验06—HTTP
文章图片
出现了乱码
解决方法:
let http = require('http'); http.createServer(function(req,res){ res.writeHead(200,{'Content-Type' : 'text/html; charset:utf-8'}); res.write(''); res.write("hi,平田君,加嘞个油~~~"); res.end(); }).listen(8080);

NodeJs之初体验06—HTTP
文章图片
正常了
这是为什么呢?查阅资料后了解到
nodejs不支持完整的Unicode,我们知道nodejs是一个JavaScript的运行环境,而JavaScript 支持的字符集是双字节的UCS2,即用两个字节来表示一个Unicode 字符,最大表示的字符数量是65536。
显然这是满足不了很多需求的。所以我们想要用nodejs正常显示中文,就要做一些事情:
在返回中写入头部文件,注明 直截了当告诉浏览器要用这种编码格式解析我的数据。
Response.writeHead()方法 就是在返回页面中写入头文件
接着我们开始HTTP模块
如果要在Node.js中使用HTTP服务器或客户端功能,则必须调用require('http')引入http模块
http.METHODS 会返回一个list 里面包含解析器支持的HTTP方法列表。
http.STATUS_CODES 会返回全部标准HTTP响应状态码的和描述的集合。
例如:http.STATUS_CODES[404] === 'Not Found'

NodeJs之初体验06—HTTP
文章图片

NodeJs之初体验06—HTTP
文章图片
http.createServer([requestListener]) 该函数用来创建一个HTTP服务器,并将 requestListener 作为 request 事件的监听函数。
requestListener 请求处理函数,自动添加到 request 事件,函数传递两个参数:
req 请求对象,想知道req有哪些属性,可以查看 “http.request 属性整合”。
res 响应对象 ,收到请求后要做出的响应。想知道res有哪些属性,可以查看 “http.response属性整合”。
http.Server 这是一个类,上面的http.createServer(requestListener )方法返回的其实就是一个http.server类对象,
http.createServer(function(req,res){ res.writeHead(200,{'Content-Type' : 'text/html; charset:utf-8'}); res.write(''); res.write("hi,平田君,加嘞个油~~~"); res.end('Hello World
'); }).listen(8080);

其实就等价于
et server = new http.Server(); server.on('request', (req, res)=>{ res.writeHead(200, {''Content-Type' : 'text/html; charset:utf-8'}); res.write(''); res.write("hi,平田君,加嘞个油~~~"); res.end('Hello World
'); }); server.listen(8080)

前面说到的requestListener自动添加到 request 事件 说的就是上面的request啦
我们知道request属于事件的一种,server类支持的事件当然不止这一种啦
  • request : function (request, response) { }
每当有请求的时候触发。注意:每个连接可以有多个请求(在keep-alive连接中)
  • connection: function (socket) { }
当建立新的TCP流的时候。socket是一个net.Socket对象。通常用户不会访问这个事件。协议解析器绑定套接字时采用的方式使套接字不会出发readable事件。也能通过request.connection访问socket
  • close:function () { }
【NodeJs之初体验06—HTTP】服务器关闭的时候触发
  • checkContinue:function (request, response) { }
当http收到100-continue的http请求时会触发。如果没有监听这个事件,服务器将会自动发送100 Continue的响应。
如果客户端需要继续发送请求主题,或者生成合适的HTTP响应(如,400请求无效),可以通过调用response.writeContinue()来处理。
注意:触发并处理这个事件的时候,不会再触发request事件。
  • connect:function (request, socket, head) { }
当客户端请求http连接时触发。如果没有监听这个事件,客户端请求连接的时候会被关闭。
request是http请求的参数,与request事件参数相同。
socket是服务器和客户端间的socket。
head是buffer的实例。网络隧道的第一个包,可能为空。
这个事件触发后,请求的socket不会有data事件监听器,也就是说你需要绑定一个监听器到data上,来处理在发送到服务器上的socket数据。
  • upgrade:function (request, socket, head) { }
当客户端请求http upgrage时候会触发。如果没有监听这个事件,客户端请求一个连接的时候会被关闭。
这个事件触发后,请求的socket不会有data事件监听器,也就是说你需要绑定一个监听器到data上,来处理在发送到服务器上的socket数据。
  • clientError:function (exception, socket) { }
如果一个客户端连接触发了一个'error'事件,它就会转发到这里.
socket是导致错误的net.Socket对象。
Listening事件
以下是server .listen的一些api方法
server.listen(port, [hostname], [backlog], [callback])
  • 监听客户端连接请求,只有当调用了listen方法以后,服务器才开始工作
  • port : 监听的端口
  • hostname : 主机名(IP/域名)
  • backlog : 连接等待队列的最大长度
  • callback : 调用listen方法并成功开启监听以后,会触发一个listening事件,callback将作为该事件的执行函数
例如:
server.listen(8080,'127.0.0.1',1,(req,res)=>{ console.log('22222222'); })

我们监听本机的8080端口,当我们一执行代码,在控制窗口就会打出2222222来因为监听到了8080端口是开启的

NodeJs之初体验06—HTTP
文章图片
server.listen(path[, callback])
启动一个本地socket服务器,监听指定path的连接。
这是异步函数。绑定服务器后,会触发'listening'事件。最后一个参数callback将会作为'listening'事件的监听器。
Windows上,本地域通过命名管道实现。路径必须是以\?\pipe\或\.\pipe\入口。任意字符串都可以,不过之后进行相同的管道命名处理,比如解决..序列。管道命名空间是平的。管道不会一直持久,当最后一个引用关闭的时候,管道将会移除。不要忘记javascript字符字符串转义要求路径使用双反斜杠,比如:
net.createServer().listen( path.join('\\?\pipe', process.cwd(), 'myctl'))
server.listen(handle[, callback])
handle 对象可以设置成server或socket(任意以下划线_handle开头的类),或者是{fd: }对象。
这将是服务器用指定的句柄接收连接,前提是文件描述符或句柄已经绑定到端口或域socket。
Windows不支持监听文件句柄。
这是异步函数。当服务器已经被绑定,将会触发'listening'事件。最后一个参数callback将会作为'listening'事件的监听器。
server.listen(options[, callback])
  • options {Object} - 必须有。支持以下属性:
  • port {Number} - 可选。
  • host {String} - 可选。
  • backlog {Number} - 可选。
  • path {String} - 可选。
  • exclusive {Boolean} - 可选。
  • callback {Function} - 可选。
    options的属性:端口port,主机host,和backlog,以及可选参数callback函数,他们在一起调用server.listen(port, [host], [backlog], [callback])。还有,参数path可以用来指定UNIX socket。
    如果参数exclusive是false(默认值),集群进程将会使用同一个句柄,允许连接共享。当参数exclusive是true时,句柄不会共享,如果共享端口会返回错误。监听独家端口例子如下:
server.listen({ host: 'localhost', port: 80, exclusive: true });

server.close([callback])
服务器停止接收新的连接,保持现有连接。这是异步函数,当所有连接结束的时候服务器会关闭,并会触发'close'事件。你可以传一个回调函数来监听'close' 事件。如果存在,将会调用回调函数,错误(如果有)作为唯一参数。
server.address()
操作系统返回绑定的地址,协议族名和服务器端口。查找哪个端口已经被系统绑定时,非常有用。返回的对象有3个属性,比如:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
server.getConnections(callback)
异步获取服务器当前活跃连接的数量。当socket发送给子进程后才有效;
回调函数有2个参数err和count。
当然这些都是我自己在网上看资料的一些心得,可能理解有些偏差或错误,如果有大神发现,希望可以不吝指正~~如有也是初学者,希望可以留言探讨共同学习

    推荐阅读