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类的静态属性和实例属性的理解
Oct 01 Javascript
dreamweaver 安装Jquery智能提示
Apr 02 Javascript
js中的this关键字详解
Sep 25 Javascript
超链接的禁用属性Disabled使用示例
Jul 31 Javascript
Vue.js实战之组件之间的数据传递
Apr 01 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 Javascript
vue 实现数字滚动增加效果的实例代码
Jul 06 Javascript
layui弹出层按钮提交iframe表单的方法
Aug 20 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 Javascript
微信小程序 setData 对 data数据影响问题
Apr 18 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
JS实现留言板功能
2017/06/17 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
理解Python中的类与实例
2015/04/27 Python
Python随机函数random()使用方法小结
2018/04/29 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
py-charm延长试用期限实例
2019/12/22 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
管理建议书范文
2014/05/13 职场文书
2015年植树节活动总结
2015/02/06 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书