Nodejs核心模块之net和http的使用详解


Posted in NodeJs onApril 02, 2019

前言

net和http模块都是node核心模块之一,他们都可以搭建自己的服务端和客户端,以响应请求和发送请求。

net模块服务端/客户端

这里写的net模块是基于tcp协议的服务端和客户端,用到net.createServer和net.connect实现的一个简单请求与响应的demo。

//tcp服务端
var net = require('net')
var sever=net.createServer(function(connection){
  //客户端关闭连接执行的事件
 connection.on('end',function(){
  //  console.log('客户端关闭连接')
 })
 connection.on('data',function(data){
  console.log('服务端:收到客户端发送数据为'+data.toString())
})
//给客户端响应的数据
 connection.write('response hello')
})
sever.listen(8080,function(){
  // console.log('监听端口')
})
//tcp客户端
var net = require('net')
var client = net.connect({port:8080},function(){
  // console.log("连接到服务器")
})
//客户端收到服务端执行的事件
client.on('data',function(data){
  console.log('客户端:收到服务端响应数据为'+data.toString())
  client.end()
})
//给服务端传递的数据
client.write('hello')
client.on('end',function(){
  // console.log('断开与服务器的连接')
})

运行结果

Nodejs核心模块之net和http的使用详解

Nodejs核心模块之net和http的使用详解

http模块四种请求类型

http服务端:

http.createServer创建了一个http.Server实例,将一个函数作为HTTP请求处理函数。这个函数接受两个参数,分别是请求对象(req)处理请求的一些信息和响应对象(res)处理响应的数据。

//http服务端
const http = require("http");
var fs = require("fs");
var url = require('url')

http.createServer(function (req, res) {
  var urlPath = url.parse(req.url);
  var meth = req.method
  //urlPath.pathname 获取及设置URL的路径(path)部分
  //meth 获取请求数据的方法,一个路径只能被一种方法请求,其他方法请求时返回404
  if (urlPath.pathname === '/' && meth === 'GET') {
    res.write(' get ok');
  } else if (urlPath.pathname === '/users' && meth === 'POST') {
    res.writeHead(200, {
      'content-type': 'text/html;charset=utf-8'
    });
    fs.readFile('user.json', function (err, data) {
      if (err) {
        return console.error(err);
      }
      var data = data.toString();
      // 返回数据
      res.write(data);
    });
  } else if (urlPath.pathname === '/list' && meth === 'PUT') {
    res.write('put ok');
  } else if (urlPath.pathname === '/detail' && meth === 'DELETE') {
    res.write(' delete ok');
  } else {
    res.writeHead(404, {
      'content-type': 'text/html;charset=utf-8'
    });
    res.write('404')
  }
  res.on('data', function (data) {
    console.log(data.toString())
  })

}).listen(3000, function () {
  console.log("server start 3000");
});

http客户端:

http模块提供了两个创建HTTP客户端的方法http.request和http.get,以向HTTP服务器发起请求。http.get是http.request快捷方法,该方法仅支持GET方式的请求。

http.request(options,callback)方法发起http请求,option是请求的的参数,callback是请求的回掉函数,在请求被响应后执行,它传递一个参数,为http.ClientResponse的实例,处理返回的数据。

options常用的参数如下:

1)host:请求网站的域名或IP地址。
2)port:请求网站的端口,默认80。
3)method:请求方法,默认是GET。
4)path:请求的相对于根的路径,默认是“/”。请求参数应该包含在其中。
5)headers:请求头的内容。

nodejs实现的爬虫其实就可以用http模块创建的客户端向我们要抓取数据的地址发起请求,并拿到响应的数据进行解析。

get

//http客户端
const http = require("http");
// 发送请求的配置
let config = {
  host: "localhost",
  port: 3000,
  path:'/',
  method: "GET",
  headers: {
    a: 1
  }
};
// 创建客户端
let client = http.request(config, function(res) {
  // 接收服务端返回的数据
  let repData='';
  res.on("data", function(data) {
    repData=data.toString()
    console.log(repData)
  });
  res.on("end", function() {
    // console.log(Buffer.concat(arr).toString());
  });
});
// 发送请求
client.end();结束请求,否则服务器将不会收到信息

客户端发起http请求,请求方法为get,服务端收到get请求,匹配路径是首页,响应数据:get ok。

post

//http客户端
var http = require('http');
var querystring = require("querystring");
var contents = querystring.stringify({
  name: "艾利斯提",
  email: "m778941332@163.com",
  address: " chengdu",
});
var options = {
  host: "localhost",
  port: 3000,
  path:"/users",
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": contents.length
  }
};
var req = http.request(options, function (res) {
  res.setEncoding("utf8");
  res.on("data", function (data) {
    console.log(data);
  })
})

req.write(contents);
//结束请求,否则服务器将不会收到信息
req.end(); 
//响应的数据为
{
  "user1" : {
    "name" : "mahesh",
    "password" : "password1",
    "profession" : "teacher",
    "id": 1
  },
  "user2" : {
    "name" : "suresh",
    "password" : "password2",
    "profession" : "librarian",
    "id": 2
  }
 }

客户端发起http请求,请求方法为post,post传递数据,匹配路径是/users,服务器响应请求并返回数据user.json里的内容。

put

//http客户端
const http = require("http");
// 发送请求的配置
let config = {
  host: "localhost",
  port: 3000,
  path:"/list",
  method: "put",
  headers: {
    a: 1
  }
};
// 创建客户端
let client = http.request(config, function(res) {
  // 接收服务端返回的数据
  let repData='';
  res.on("data", function(data) {
    repData=data.toString()
    console.log(repData)
  });
  res.on("end", function() {
    // console.log(Buffer.concat(arr).toString());
  });
});
// 发送请求
client.end();

客户端发起http请求,请求方法为put,服务端收到put请求,匹配路径为/list,响应数据:put ok

delect

//http delete请求客户端
var http = require('http');
var querystring = require("querystring");
var contents = querystring.stringify({
  name: "艾利斯提",
  email: "m778941332@163.com",
  address: " chengdu",
});
var options = {
  host: "localhost",
  port: 3000,
  path:'/detail',
  method: "DELETE",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": contents.length
  }
};
var req = http.request(options, function (res) {
  res.setEncoding("utf8");
  res.on("data", function (data) {
    console.log(data);
  })
})

req.write(contents);
req.end();

服务端收到delete请求,匹配路径为/detail,响应数据:delete ok

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 #NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 #NodeJs
详解nodejs http请求相关总结
Mar 31 #NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 #NodeJs
nodejs微信开发之自动回复的实现
Mar 17 #NodeJs
nodejs微信开发之接入指南
Mar 17 #NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 #NodeJs
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
用JS实现选项卡
2020/03/23 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python 对象中的数据类型
2017/05/13 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
python实现图像识别功能
2018/01/29 Python
Python----数据预处理代码实例
2019/03/20 Python
通过cmd进入python的实例操作
2019/06/26 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
法人授权委托书格式
2014/04/08 职场文书
社会实践活动总结范文
2014/07/03 职场文书
离职报告格式
2014/11/04 职场文书
企业整改报告范文
2014/11/08 职场文书
使用Redis做预定库存缓存功能
2022/04/02 Redis
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android