首先。你要明白http模块四个类是干嘛的,http四大类:http.ClientRequest 类,http.Server 类,http.ServerResponse 类,http.IncomingMessage 类.
两个关键函数
request :这是客户端专用的创建http会话的工具。他的回调函数其实就是response事件的回调函数。但是这个回调函数接受的参数是incomingmessage,这个英语很形象,来电信息,那么我们就知道这是从服务器传进来的,然后,我们就可以利用incomingmessage里面的工具,对他进行反馈。
createserver,就是服务器专用的工具函数了,他的回调函数其实是触发了http.server类里的request事件。他的req接受的是incomingmessage,来电信息,对于服务器而言你客户端就是来电信息。同样服务器需要发话。它用的就是serverresponse类发送会话处理的。那么服务器一个接受信息后,用incoming来处理,发送用serresponse进行处理。
然后server类是对服务器本身进行服务拓展。clientResponse是客户端自身处理,还有对服务器进行发送信息,进行处理。
http.Server 类:仅仅对服务器本身能力。不对发送信息进行处理。也不对接受信息进行处理。
http.ClientRequest 类:对客户端本身能力,也对发送信息进行处理。但不对接受的信息进行处理。(触发close事件,也是在request内部设定好了。)
http.ServerResponse 类:服务器对发送信息进行处理。
http.IncomingMessage 类.:客户端和服务端的接受信息处理类。
所以,你可以把http的客户端和服务端分成三部分,一部分;本身。一部分:发送会话处理。最后一部分:接受会话:处理。
下面摆上程序,应该不会出错。建议在学习相关api后进行处理。
客户端:
// 通过nodejs模拟客户端
const http = require("http");
let options = {
method:"post",
host:"127.0.0.1",
port:2121,
path:"/"
};
let obj = {
name:"李四",
age:20
};
let request = http.request(options,function (res) {
console.log('建立了请求');
let str = "";
res.setEncoding('utf8').on("data",function(chunk){
console.log(chunk);
str += chunk;
});
res.on("end",function () {
console.log('服务器已经全部发送完毕');
})
});
request.on('error',(error)=>{
console.log(error)
});
request.write(JSON.stringify(obj),'utf8');
request.end();
request.setSocketKeepAlive(true,1000);
request.setTimeout(5000,()=>{
console.log('链接超时');
});
request.on('socket',()=>{
console.log('发送了socket请求');
});
request.on('close',()=>{
console.log('触发了close事件');
});
服务端:
const http = require("http");
const fs = require("fs");
const url = require("url");
const querystring = require("querystring");
let server = http.createServer(function (req,res) {
console.log(req.method);
req.setEncoding('utf8').on('data',(data)=>{
console.log(data)
});
req.on("end",function () {
console.log('客户端已经全部发送完毕');
});
res.write('你好啊,我是服务器','utf8');
res.end()
});
server.listen(2121,()=>{
console.log('服务器开始监听!');
});
服务器是可以自己关闭的额,但是客户端貌似自动关闭了。我对keepalive,也不怎么懂。dgram,net,http模块,三个大块。真的是各不相同。
假设,我先打开服务器
1.服务器的listen方式就开始执行了。创建服务器,但是不使用回调函数,回调函数要等客户端发送信息。request事件。
2.客户端开始链接。他就是一个tcp包装过的,但是他的回调函数(response),也要等服务器发送信息。先出发soket事件。然后,可以使用clientresponse中的一些函数进行传送信息。主要两个(write和end,write发送信息,触发服务器data事件。end,触发服务器的end事件。)
3.服务器的request事件,接受到了信号。对req,来自客户端。用incoming进行加工。根据data事件和end事件。
然后发送信息,使用serverresponse。end和write相同的触发的是客户端的事件。要交互吗。客户端和服务器。
接受到信息后触发end事件过后,那么这个会话他就结束了。