环境:Node v8.2.1; Npm v5.3.0; OS Windows10
客户端、服务端对咱们都不陌生,Node.js 中的 HTTP 接口被设计成支持协议的许多特性。 好比,大块编码的消息。 这些接口不缓冲完整的请求或响应,用户可以以流的形式处理数据。app
为了支持各类可能的 HTTP 应用,Node.js 的 HTTP API 是很是底层的。 它只涉及流处理与消息解析。 它把一个消息解析成消息头和消息主体,但不解析具体的消息头或消息主体。框架
因为该模块中的内容比较多,图片我就分开传了,避免一张图密密麻麻的。socket
在看API以前,我仍是简单的缕一缕上面几个类的关系吧,从一个简单的例子开始post
const http = require("http"); //server const server = http.createServer((clientReq,serverRes)=>{ serverRes.end(); }).listen(3000) //client const client=http.get("http://localhost:3000",(clientRes)=>{ })
上面那么简单的几行代码已经成功建立了一个server和一个client,看似简单,实际上却不这样,上面代码以一共建立了4个实例,能够对照着顶部的那张图看。ui
图片有点乱,在画图本里面拖出来的,讲究看吧,下面贴出继承关系的源码,只贴框架,里面具体的内容就不贴了,贴出来感受蛮乱的。google
http.IncomingMessage 类继承 stream.Readable:编码
export class IncomingMessage extends stream.Readable {}
http.ServerResponse 类继承stream.Writable:url
export class OutgoingMessage extends stream.Writable {} export class ServerResponse extends OutgoingMessage {}
下面是部分API的例子,对部分API的一个简单代码实现spa
const http = require("http"); const server=http.createServer((ClientRequest,ServerResponse)=>{ ServerResponse.end(); }) server.listen(3000); console.log("listening: "+server.listening); console.log("maxHeadersCount: "+server.maxHeadersCount); console.log("timeout: "+server.timeout); console.log("keepAliveTimeout: "+server.keepAliveTimeout); // listening: true // maxHeadersCount: null (没有限制) // timeout: 120000 // keepAliveTimeout: 5000
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.end(); }).listen(3000); server.on("request", (request, response) => { console.log("服务端收到请求"); }) server.on("connection",socket=>{ //超过默认的5000msTCP流会被关闭,再次请求时会被从新创建 console.log("一个新的 TCP 流被创建"); })
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.writeHead(200, { 'Content-Type': 'text/plain'}); ServerResponse.write("hello world"); console.log("connection: "+ServerResponse.connection); console.log("finished: "+ServerResponse.finished); console.log("headersSent: "+ServerResponse.headersSent); console.log("sendDate: "+ServerResponse.sendDate); console.log("socket: "+ServerResponse.socket); console.log("statusCode: "+ServerResponse.statusCode); console.log("statusMessage: "+ServerResponse.statusMessage); ServerResponse.end(); console.log("finished: "+ServerResponse.finished); }).listen(3000); /* connection: [object Object] finished: false headersSent: true sendDate: true socket: [object Object] statusCode: 200 statusMessage: OK finished: true */
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' }); ServerResponse.write("hello world"); ServerResponse.addTrailers({'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667'}) ServerResponse.end(); }).listen(3000);
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.setHeader("foo","bar"); ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' }); ServerResponse.write("hello world"); console.log(ServerResponse.getHeader("foo")); ServerResponse.end(); }).listen(3000);
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.setHeader("foo","bar"); ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' }); ServerResponse.write("hello world"); console.log(ServerResponse.getHeaderNames()); //[ 'foo', 'content-type' ] ServerResponse.end(); }).listen(3000);
const http = require("http"); const ClientRequest = http.get("http://localhost:3000", res => { res.setEncoding("utf8") let rawData = ''; res.on("data", chunk => { rawData += chunk; }) res.on("end", () => { console.log(rawData); }) }) ClientRequest.on("response", (imsg) => { console.log("收到响应"); })
摘一个官方例子^_^设计
const postData = querystring.stringify({ 'msg' : 'Hello World!' }); const options = { hostname: 'www.google.com', port: 80, path: '/upload', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; const req = http.request(options, (res) => { console.log(`状态码: ${res.statusCode}`); console.log(`响应头: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(`响应主体: ${chunk}`); }); res.on('end', () => { console.log('响应中已无数据。'); }); }); req.on('error', (e) => { console.error(`请求遇到问题: ${e.message}`); }); // 写入数据到请求主体 req.write(postData); req.end();