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 相关文章推荐
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
jquery表单验证需要做些什么
Nov 17 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
JavaScript基础之this详解
Jun 04 Javascript
JSON创建键值对(key是中文或者数字)方式详解
Aug 24 Javascript
详解PHP后期静态绑定分析与应用
Mar 21 Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 Javascript
vue中axios的封装问题(简易版拦截,get,post)
Jun 15 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
JavaScript 继承 封装 多态实现及原理详解
Jul 29 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
深入解析php之sphinx
2013/05/15 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
最短的IE判断代码
2011/03/13 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
后勤园长自我鉴定
2013/10/17 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书