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 npm package.json中文文档
Sep 04 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
nodejs文件夹深层复制功能
Sep 03 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP面向对象精要总结
2014/11/07 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python列表list数组array用法实例解析
2014/10/28 Python
python显示生日是星期几的方法
2015/05/27 Python
python中字符串前面加r的作用
2015/06/04 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Python创建数字列表的示例
2019/11/28 Python
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
UNIX文件类型
2013/08/29 面试题
航海技术专业毕业生推荐信
2014/07/09 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
Linux磁盘管理方法介绍
2022/06/01 Servers