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 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
Aug 04 Javascript
轻量级 JS ToolTip提示效果
Jul 20 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
Sep 16 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
Nov 18 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 Javascript
Express.JS使用详解
Jul 17 Javascript
JS模式之单例模式基本用法
Jun 30 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
JsonProperty 的使用方法详解
Oct 11 Javascript
利用node.js开发cli的完整步骤
Dec 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
python选择排序算法的实现代码
2013/11/21 Python
python访问sqlserver示例
2014/02/10 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
运动会解说词50字
2014/01/18 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
python可视化之颜色映射详解
2021/09/15 Python
Python实现自动玩连连看的脚本分享
2022/04/04 Python