node.js使用http模块创建服务器和客户端完整示例


Posted in Javascript onFebruary 10, 2020

本文实例讲述了node.js使用http模块创建服务器和客户端。分享给大家供大家参考,具体如下:

node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议。

一、创建http服务器

const http = require('http');
//创建一个http服务器
let server = http.createServer();
//监听端口
server.listen(8888, '0.0.0.0');
//设置超时时间
server.setTimeout(2 * 60 * 1000);
//服务器监听时触发
server.on('listening', function () {
  console.log('监听开始');
});
//接收到客户端请求时触发
server.on('request', function (req, res) {
  //req表示客户端请求对象,是http.IncomingMessage类的实例,可读流。
  //res表示服务端响应对象,是http.ServerResponse类的实例,可写流。
  //请求方法
  console.log(req.method);
  //请求url
  console.log(req.url);
  //请求的头信息
  console.log(req.headers);
  //请求的http版本
  console.log(req.httpVersion);
  //请求对象的socket对象
  console.log(req.socket);
  res.end('hello');
});
//连接建立时触发
server.on('connection', function (socket) {
  console.log('建立连接');
});
//客户端向服务器发送CONNECT请求时触发
server.on('connect', function (req, socket, head) {
  console.log('客户端connect');
});
//服务器关闭时触发,调用 close() 方法。
server.on('close', function () {
  console.log('服务器关闭');
});
//发生错误时触发
server.on('error', function (err) {
  console.log(err);
});
//如果连接超过指定时间没有响应,则触发。
//超时后,不可再复用已建立的连接,需发请求重新建立连接
server.on('timeout', function (socket) {
  console.log('连接已超时');
});

请求对象 req 里保存了客户端的详细信息,包括 url,请求参数等,为了方便的解析这些参数,我们可以使用 url.parse() 方法。

const http = require('http');
const url = require('url');
//创建一个http服务器
let server = http.createServer();
//监听端口
server.listen(8888, '0.0.0.0');
//接收到客户端请求时触发
server.on('request', function (req, res) {
  //解析url返回一个url对象
  //如果参数二设为true,则url对象中的query属性将通过querystring.parse()生成一个对象
  let params = url.parse(req.url, true);
  //完整url地址
  console.log('href', params.href);
  //主机名,包含端口
  console.log('host', params.host);
  //主机名,不包含端口
  console.log('hostname', params.hostname);
  //端口
  console.log('port', params.port);
  //协议
  console.log('protocol', params.protocol);
  //路径,包含查询字符串
  console.log('path', params.path);
  //路径,不包含查询字符串
  console.log('pathname', params.pathname);
  //查询字符串,不包含 ?
  console.log('query', params.query);
  //查询字符串,包含 ?
  console.log('search', params.search);
  //散列字符串,包含 #
  console.log('hash', params.hash);
  res.end('end');
});

响应对象 res 可以设置服务器响应给客户端的一些参数。

const http = require('http');
const url = require('url');
//创建一个http服务器
let server = http.createServer();
//监听端口
server.listen(8888, '0.0.0.0');
//接收到客户端请求时触发
server.on('request', function (req, res) {
  //设置响应头信息
  res.setHeader('Content-Type', 'text/html;charset=utf-8');
  //获取响应头信息
  res.getHeader('Content-Encoding');
  res.setHeader('test', 'test');
  //删除响应头信息
  res.removeHeader('test');
  //判断响应头是否已发送
  console.log(res.headersSent ? '已发送' : '未发送');
  //注意writeHead()与setHeader()的区别,setHeader()并不会立即发送响应头。
  //而writeHead()会发送,writeHead()设置的响应头比setHeader()的优先。
  res.writeHead(200, {
    'aaa': 'aaa'
  });
  //判断响应头是否已发送
  console.log(res.headersSent ? '已发送' : '未发送');
  //如何不发送日期 Date,设置为false将不发送Date
  res.sendDate = false;
  //设置响应的超时时间
  res.setTimeout(30 * 1000);
  res.on('timeout', function () {
    console.log('响应超时');
  });
  //向客户端发送数据
  //由于res响应对象也是一个流,所以可以使用write()来写数据
  res.write(Buffer.from('你好'));
  res.write(Buffer.from('欢迎'));
  res.end('end');
});

二、http的客户端

有些时候我们需要通过get或post去请求其它网站的资源或接口,这个时候就需要用到http客户端了。

const http = require('http');
const zlib = require('zlib');
let client = http.request({
  //协议
  'protocol': 'http:',
  //主机名或IP
  'hostname': 'www.baidu.com',
  //端口
  'port': 80,
  //请求方式
  'method': 'GET',
  //请求路径和查询字符串
  'path': '/',
  //请求头对象
  'headers': {
    'Accept-Encoding': 'gzip, deflate, br'
  },
  //超时时间
  'timeout': 2 * 60 * 1000
});
//发送请求
client.end();
//响应被接收到时触发
client.on('response', function (res) {
  console.log('状态吗:' + res.statusCode);
  console.log('响应头:' + JSON.stringify(res.headers));
  //头信息的名称为小写
  let encoding = res.headers['content-encoding'];
  //判断响应头中的内容编码,是否有过压缩,如果有则进行解压
  if (encoding.match(/\bgzip\b/)) {
    res.pipe(zlib.createGunzip()).pipe(process.stdout);
  } else if (encoding.match(/\bdeflate\b/)) {
    res.pipe(zlib.createInflate()).pipe(process.stdout);
  } else {
    res.pipe(process.stdout);
  }
});
//请求过程中出错了触发
client.on('error', function (err) {
  console.log(err);
});
//当 socket 被分配到请求后触发
client.on('socket', function (socket) {
  socket.setTimeout(2 * 60 * 1000);
  socket.on('timeout', function () {
    //终止本次请求
    client.abort()
  });
});

也可以使用 http.get() 简便方法进行 get 请求。

const http = require('http');
//会自动调用 req.end(),默认为 get 请求。
http.get('http://www.baidu.com', function (res) {
  res.on('data', function (data) {
    console.log(data.toString());
  });
});

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
js判断undefined类型,undefined,null, 的区别详细解析
Dec 16 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
Jun 20 Javascript
js 左右悬浮对联广告特效代码
Dec 12 Javascript
jQuery插件实现多级联动菜单效果
Dec 01 Javascript
angularjs自定义ng-model标签的属性
Jan 21 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
微信小程序使用for循环动态渲染页面操作示例
Dec 25 Javascript
vue集成chart.js的实现方法
Aug 20 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 Javascript
javascript实现文字跑马灯效果
Jun 18 Javascript
JS实现简易图片自动轮播
Oct 16 Javascript
webpack打包优化的几个方法总结
Feb 10 #Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 #Javascript
node.js制作一个简单的登录拦截器
Feb 10 #Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
Feb 10 #Javascript
jQuery实现简易QQ聊天框
Feb 10 #jQuery
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 #Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 #Javascript
You might like
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
php生成zip文件类实例
2015/04/07 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
Prototype框架详解
2015/11/25 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
python根据京东商品url获取产品价格
2015/08/09 Python
python二分查找算法的递归实现方法
2016/05/12 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
2015年幼儿园毕业感言
2014/02/12 职场文书
企业标语大全
2014/07/01 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
毕业论文致谢词
2015/05/14 职场文书
新闻稿标题
2015/07/18 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
实习报告范文
2019/07/30 职场文书