本文节选自《Nodejs学习笔记》,更多章节及更新请访问github主页地址。http模块概述大多数nodejs开发者选择nodejs是为了开发web服务器。如官网所示,借助http模块,几行代码就可以搭建一个超级迷你的web服务器。在nodejs中,http可以说是核心模块,也是一个比较复杂的模块。上手容易,但是一旦学深了,很多初学者就会感到头疼,不知从何下手。本文从一个简单的例子入手,介绍http模块的四个核心例子。看完这篇文章,你应该能够对http模块有一个整体的了解。一个简单的例子在下面的例子中,我们创建一个web服务器和一个http客户端服务器:接收客户端的请求,并将客户端请求的地址返回给客户端。Client客户端:向服务器发起请求,将服务器返回的内容打印到控制台。代码如下所示,只有几行,但包含了很多信息。下一节将作简要介绍。varhttp=require('http');//http服务器示例varserver=http.createServer(function(serverReq,serverRes){varurl=serverReq.url;serverRes.end('你访问的地址是:'+url);});server.listen(3000);//http客户端示例varclient=http.get('http://127.0.0.1:3000',function(clientRes){clientRes.pipe(process.stdout);});实例说明上面这个简单的例子,涉及到4个实例。大多数时候,serverReq和serverRes是主角。server:http.Server实例,用于提供服务和处理客户端请求。client:http.ClientReques实例,用于向服务器发起请求。serverReq/clientRes:实际上是http.IncomingMessage真实的。serverReq用于获取客户端请求的相关信息,如请求头;clientRes用于获取服务器返回的相关信息,如响应头等。serverRes:http.ServerResponse实例关于http.IncomingMessage和http.ServerResponse,先说说http.ServerResponse实例。功能很明确,服务器通过http.ServerResponse实例向请求者发送数据。包括发送响应头,发送响应体等。接下来是http.IncomingMessage的实例。由于它同时出现在server和client中,初学者难免有些迷茫。它的作用在服务器端:获取请求发送方的信息,如请求方法、路径、传输的数据等。客户端:获取服务器端发送的信息,如请求方法、路径、传输的数据等。http.IncomingMessage实例有三个属性需要注意:method、statusCode、statusMessage。method:仅服务端实例可用(即serverReq.method)statusCode/statusMessage:仅客户端实例可用(即clientRes.method)关于http.Server的继承和扩展http.Server继承net.Server(所以顺带一提,需要学习net.Server的API,属性,相关事件)net.createServer(fn),回调中的socket是一个双工流接口,也就是说,由他来决定读取发件人信息,将信息发送给发件人。注意:socket的client和server是相对的概念,所以实际上net.Server内部也是使用net.Socket的(不负责任的猜想)//参考:https://cnodejs.org/topic/4fb1c1fd1975fe1e1310490bvarnet=require('net');varPORT=8989;varHOST='127.0.0.1';varserver=net.createServer(function(socket){console.log('Connected:'+socket.remoteAddress+':'+socket.remotePort);socket.on('data',function(data){console.log('DATA'+socket.remoteAddress+':'+data);console.log('Datais:'+data);socket.write('来自你的数据是"'+data+'"');});socket.on('close',function(){console.log('CLOSED:'+socket.remoteAddress+''+socket.remotePort);});});server.listen(PORT,HOST);console.log(serverinstanceofnet.Server);//truehttp.ClientRequesthttp.ClientRequest内部创建一个socket发起请求,代码如下。调用http.request(options)时,内部是self.onSocket(net.createConnection(options));http.ServerResponse实现了WritableStream接口,内部通过socket发送信息。http.IncomingMessage实现ReadableStream接口,参考req.socket-->获取本次连接相关的socket
