网络服务-http
http 模块概览
大多数nodejs开发着都是冲着开发web server的目的选择nodejs,正如官网所展示的,借助http模块,可以几行代码就搞定一个mini的webserver
在nodejs中,http可以说是最核心的模块,同时也是比较复杂的一个模块,上手很简单,但是深入学习就会不知道从何入手
一个简单的例子
创建一个web服务器, 一个http客户端;
服务器server: 接受来自客户端的请求, 并将客户端请求的地址返回给客户端;
客户端client: 向服务器发起请求, 并将服务器返回的内容打印到控制台;
const server = http.createServer((serverReq, serverRes) => {
const url = serverReq.url;
serverRes.end("访问的地址为" + url);
});
server.listen(3000);
const client = http.get("http://127.0.0.1:3000?wd=123", (clientRes) => {
clientRes.pipe(process.stdout);
});
例子解释
在上面的例子当中,涉及到了四个实例,大部分的时候,res req才是主角
server: http.Server实例,用来提供服务,处理客户端请求
client: http.ClientRequest实例,用来向服务端发起请求
serverReq/clientRes: 其实都是 http.IncomingMessage实例,serverReq用来获取客户端请求的相关信息,如requert Headers; 而clientRes用来获取服务端返回的相关信息,比如response header
serverRes: http.ServerResponse实例
关于 http.IncomingMessage, http.ServerResponse
先讲下 http.ServerResponse实例,作用很明显,服务端通过 http.ServerResponse 实例,来给请求方发送数据,包括发送响应表头,发送响应主体等
接下来是 http.IncomingMessage 实例,由于在 server client 都出现了,初学者会很迷惑,那么他的作用是,
在server端: 获取请求发送方的信息,比如请求方法,路径,传递的数据等
在client端: 获取server端发送过来的信息,比如请求犯法,路径,传递的数据等
http.IncomingMessage 实例有三个属性需要注意,method,statusCode statusMessage
method: 只有在server端的实例有 (也就是 serverReq.method)
statusCode/statusMessage: 只有在client端的实例有,(他也就是 clientRes.statusCode)
关于继承与扩展
http.Server
http.Server继承了 net.server
net.createServer(fn) 回调中的socket是个双工的stream接口,也就是说,读取发送方信息,向发送方发送信息都靠他
var PORT = 3000;
var HOST = '127.0.0.1';
const server = net.createServer(socket => {
console.log('连接的', socket.remoteAddress, socket.remotePort);
socket.on('data', data => {
console.log('获取到的数据为', socket.remoteAddress, data);
socket.write('来自你的数据是' + data)
})
socket.on('close', () => {
console.log('close', socket.remoteAddress, socket.remotePort);
})
})
http.ClientRequest
http.ClientRequest内部创建了一个socket来发起请求,
http.ServerResponse
实现了Writable Stream interface 内部是通过socket 实现的
http.IncomingMessage
实现了 Writable Stream interface
req.socket 获取跟这次链接相关的socket