HTTP
创建一个服务器
var http = require('http');
var fs = require('fs');
var url = require('url');
var serverHandle = function(req, res) {
var pathname = url.parse(req.url).pathname; // 对请求的url进行分析,取得pathname
console.log(url.parse(req.url));
console.log(url.parse(req.url).pathname);
// 消除favicon.ico影响
if (req.url !== "/favicon.ico")
console.log(req.url); //消除/favicon.ico的影响
console.log(pathname);
// 读取文件
fs.readFile(pathname.substr(1), function(err, data) {
if (err) {
console.log(err);
res.writeHead(404, {"Content-Type": "text/html"});
} else {
res.writeHead(200, {"Content-Type": "text/html"});
res.end(data.toString());
}
})
};
var server = http.createServer(serverHandle);
server.listen(3000);
console.log('http is running at 127.0.0.1:3000');
监听连接和请求
var http = require('http');
var server = http.createServer(); // 返回一个http.server实例
// 【一】
// 监听request事件,每接受到一个请求的时候触发
// 当服务端接收到客户端请求时,触发request事件,所以可以使用监听request事件的方式来代替createServer中的回调函数:
server.on('request', function(req,res) {
//接收到客户端请求的连接后代码部分
})
// 【二】
// 【监听客户端的链接】
// server.listen(port,[host],[backlog],[callback]);
server.listen(3000,127.0.0.1);
/*
port: 监听的端口号,0表示为服务器随机分配一个端口号。
host: 监听的地址,默认为本机(localhost)
backlog: 指定位于[等待队列中]的客户端连接的[最大数量]。超过此数量,则服务器拒绝新的客户端请求。
callback: 开启监听后触发的回调函数。当服务器开启监听后会触发listening事件,可以通过监听listening事件来代替callback回调函数。
*/
server.on('listening', function(){
console.log('我监听连接,并且执行此回调函数!!');
})
connection 和 request的区别
// 默认情况下,客户端与服务端每进行依次HTTP交互就进行一次连接,在HTTP1.1之后添加了长连接,
// 如果在客户端发送请求头信息中或服务器发送的响应头信息中包含“Connection: keep-live”信息,则HTTP连接将继续保持。
// 当客户端与服务器建立连接时,会触发服务器对象的connection事件,可以通过监听connection事件来处理连接后的事情,此时回调参数为socket对象。
server.on('connection', function(socket) {
console.log(socket);
})
** connection 和 request的区别
客户端与服务端每次建立连接的时候会触发connection事件,
当服务端接受到客户端请求的时候,就会触发request事件。发送请求是建立在双方已经成功连接的接触之上
通过请求获取客户端信息
当客户端与服务器连接后,服务器可以通过 http.IncommingMessage
实例化的对象(createServer方法中回调函数的第一个参数)的一些属性和方法来获取客户端的请求信息和读取客户端请求的数据。
* method: 客户端请求方式
* url: 请求的地址
* headers: 客户端发送的请求头信息
* httpVersion: HTTP请求版本
* trailers: 客户端发送的trailers对象信息。只有IncommingMessage对象的end事件触发后才能读取到该信息。
* socket: 服务器端监听客户端请求的socket对象。
* data事件: 当服务器接收到客户端发送的请求数据时触发data事件。
* end事件: 当客户端发送给服务器数据执行完毕时触发end事件。
var http = require('http');
var serverHandle = function(req,res) {
console.log(req);
req.on("data",function(data){
console.log("接收到的数据:"+decondeURIComponent(data));
});
req.on("end",function(){
console.log("数据接收完毕");
});
}
var server = http.createServer(serverHandle);
server.listen(3000);
server.on('listening', function() {
console.log('服务器启动中~~~');
})
// 一个简单的get请求,获取信息
var http = require('http');
var url = require('url');
var util = require('util');
var serverHandle = function(req,res) {
var parse = url.parse(req.url,true).query;
res.write('name'+ parse.name);
res.write('url'+ parse.url);
res.end();
}
var server = http.createServer(serverHandle);
server.listen(3000);
server.on('listening', function() {
console.log('服务器启动中~~~');
})
// http://localhost:3000/?url=123&name=321
响应客户端信息
利用http.ServerResponse
对象(createServer
方法或request
事件处理方法的第二个参数)向客户端发送数据。