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 相关文章推荐
影响jQuery使用的14个方面
Sep 01 Javascript
jQuery表单美化插件jqTransform使用详解
Apr 12 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
Jul 09 Javascript
jQuery插件ajaxFileUpload异步上传文件
Oct 19 Javascript
vue2.0 自定义日期时间过滤器
Jun 07 Javascript
Vue官网todoMVC示例代码
Jan 29 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
Aug 08 jQuery
基于vue、react实现倒计时效果
Aug 26 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
Dec 29 Javascript
微信小程序获取当前时间及星期几的实例代码
Sep 20 Javascript
微信小程序APP的生命周期及页面的生命周期
Apr 19 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
PHP动态变静态原理
2006/11/25 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
js实现聊天对话框
2020/02/08 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
python实现的一个p2p文件传输实例
2014/06/04 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
Python 元组操作总结
2019/09/18 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
《钱学森》听课反思
2014/03/01 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书