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 相关文章推荐
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 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 fread()使用技巧
2010/01/22 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
详解Vue之事件处理
2020/07/10 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
Python 数据结构之旋转链表
2017/02/25 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
竞聘上岗演讲稿
2014/05/16 职场文书
2014年个人委托书范本
2014/10/13 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript