教你用Node实现HTTP协议(三)上一章介绍了如何解析HTTP请求报文。在本章中,我们将解释如何发送和接收消息以及建立TCP连接。TCP是一个全双工通信通道。我们可以使用Node的net模块来创建一个TCP进程并监听来自客户端的请求。使用方法如下:net.createServer((socket)=>{socket.on('data',(data:Buffer)=>{//...处理接收到的客户端信息});socket.on('error',error=>{//...处理错误信息});});atdata事件中收到的数据属于字节流数据(Buffer对象),我们需要使用Buffer对象的toString方法解析字节流,并将其转换为utf-8格式的字符。然后转换后的字符串通过我们的HttpParser进行处理,然后将序列化后的请求对象挂载到http.createServer((req,res)=>{})中的req上,可以通过res.end(message)进行消息响应.我们分析上面的步骤可以看出,我们还需要两个类,一个是用来承载Request信息的,另一个是用来处理响应结果Response的,那么我们现在就创建这两个类://usedto处理请求信息importHttpParser,{HttpMessage}from"./HttpParser";classIncomingMessage{privatehttpParser:HttpParser;公共httpMessage:HttpMessage;构造函数(消息:字符串){this.httpParser=newHttpParser(消息);this.httpMessage=this.httpParser.httpMessage;}}exportdefaultIncomingMessage;//用于响应处理结果import*asnetfrom'net';//ResponseFormatter是反序列化JSON数据的类,可以从源码仓库查看importResponseFormatterfrom'./ResponseFormatter';classServerResponse{私有套接字:net.Socket;私有resFormatter:ResponseFormatter;构造函数(套接字:net.Socket){this.socket=socket;this.resFormatter=newResponseFormatter();}publicsetHeader(key:string,val:string){this.resFormatter.setHeader(key,val);}publicend(status:number,body:string){constresFormatter=this.resFormatter;resFormatter.setStatus(状态);资源Formatter.setBody(正文);//接下来三步是向客户端发送TCP字节流数据this.socket.write(resFormatter.format());this.socket.pipe(this.socket);这个.套接字。结尾();}}导出默认服务器响应;最后,我们在我们的事件监听器中添加这两个处理对象:socket.on('data',(data:Buffer)=>{//...处理接收到的Client信息constmessage=data.toString('utf-8');//解码字节流数据this.request=newIncomingMessage(message);//封装请求对象this.response=newServerResponse(socket);//封装响应对象this.handler(this.request,this.response);//将两个对象作为参数传递给回调函数});现在我们只需要正确的给HTTP对象添加回调函数,我们最终的HTTP类实现如下:import*asnetfrom'net';import*asEventEmitterfrom'events';importIncomingMessagefrom"./IncomingMessage";从"./ServerResponse"导入ServerResponse;typeHandler=(request:IncomingMessage,response:ServerResponse)=>void;classHTTPextendsEventEmitter{handler:Handler;请求:传入消息;响应:服务器响应;服务器:net.Server;套接字:net.Socket;构造或(处理程序:处理程序){超级();this.handler=处理程序;这个.createServer();}privatecreateServer():void{this.server=net.createServer((socket)=>{socket.on('data',(data:Buffer)=>{constmessage=data.toString('utf-8');this.request=newIncomingMessage(message);this.response=newServerResponse(socket)this.handler(this.request,this.response);});socket.on('error',error=>{this.emit('错误',错误)});});}publiclisten(port:number,cb:any=()=>{}):void{this.server.listen(port,cb);this.server.on('error',error=>this.emit('error',error));}}constcreateServer=(handler:Handler)=>{returnnewHTTP(handler)}exportdefault{createServer}完成最后的HTTP类后,我们就可以通过第一章的方法创建一个HTTP服务器,并可以处理请求信息,并将请求信息完整返回给客户端。至此,一个HTTP协议就被我们实现了!源码地址,欢迎Star原文地址,欢迎Star
