在第一篇了解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/');
然后我们运行后发现事情并没有那么简单:
解决方法:
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不支持完整的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'
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 () { }
服务器关闭的时候触发
- 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端口是开启的
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。
当然这些都是我自己在网上看资料的一些心得,可能理解有些偏差或错误,如果有大神发现,希望可以不吝指正~~如有也是初学者,希望可以留言探讨共同学习