当前位置: 首页 > 编程日记 > 正文

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

前言

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('断开与服务器的连接')
})

运行结果

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 获取请求数据的方法,一个路径只能被一种方法请求,其他方法请求时返回404if (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

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

转自:

https://www.jb51.net/article/158913.htm

转载于:https://www.cnblogs.com/xiaohuizhenyoucai/p/11016725.html

相关文章:

NODEJS 使用 XLSX模块导出excel文件

参考:https://www.itranslater.com/qa/details/2582439815438402560 生成excel /*** 用于排序* param a* param b* returns {number}*/ function sortAlphaNum(a, b) {let reA /[^a-zA-Z]/g;let reN /[^0-9]/g;let aA a.replace(reA, "");let bA b.re…

poj 3352

题意:一个连通的无向图,求至少需要添加几条边,救能保证删除任意一条边,图仍然是连通的。 思路:边的双连通图。其实就是要求至少添加几条边,可以使整个图成为一个边双连通图。用tarjan算法(求割点割边)求出l…

oracle删除大表的数据的方法

今天在公司中碰到访问表数据(test 表)速度非常慢,简单的一个select 语句花了10多分钟, 后来查询一下表的数据量,一共有278万多条数据,而且这个数据表的数据大都过期了,对于现在的业务没什么用。可悲的是这个表竟然也没…

ClickHouse 学习

DDL 添加数据库字段 alter table user_tags add column last_subject String; alter table user_tags add column class_trust_valids Int8; 删除列 ALTER TABLE [db].name [ON CLUSTER cluster] DROP COLUMN ... 日期函数 当toDate 遇到空的串报异常时 select toDate();…

zTree实现节点修改的实时刷新

一、应用场景 在实际应用中会遇到动态操作树各节点的需求,在增加树节点后如何实时动态刷新树就十分有必要了。二、项目实践 比如要在test1234节点下新建子节点,首先要选中test1234节点,添加成功后,根据test1234结点的TID去后台请求…

magento常用软件

常见问题: 1. 装完插件导致后台配置出现 Access denied 信息,需要重置账号权限,方可恢复正常。 2. 大多数无法安装插件时,请删除 /downloader/pearlib/pear.ini 文件,最后到 Connect Manager 里保存下设置&#…

连接惠普打印机(通过WIFI)

第一步 找到打印机型号 第二步 到惠普官方网站下载对应驱动 第三步 安装驱动 第四步 安装驱动后选择WIFI连接(IP在打印机显示屏幕上显示,如果输入打印机屏幕IP连接失败;需要获取打印机真正的IP地址,在HP设备工具箱中获取&#xff…

ADO.NET的连接模式

1、连接模式:客户机一直保持和数据库服务器的链接,适合数据传输量少,系统规模不大、客户机和服务器在同一网络内的环境。 使用连接模式下数据访问的步骤如下: a、使用connection对象连接数据库 b、使用command(命令&am…

App调用safar

/调用safar打开网页 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:"http://www.cnblogs.com/foxmin"]]; 调用app store (省略号后面加的是产品的id等一些参数) // [[UIApplication sharedApplication] openURL:[NSURL URLWithString:"i…

Spring Boot 整合Redis 实现缓存

本文提纲一、缓存的应用场景二、更新缓存的策略三、运行 springboot-mybatis-redis 工程案例四、springboot-mybatis-redis 工程代码配置详解运行环境:Mac OS 10.12.xJDK 8 Redis 3.2.8Spring Boot 1.5.1.RELEASE一、缓存的应用场景 什么是缓存?在互联网…

Sqlite3支持的数据类型 日期函数 Sqlite3 函数

Sqlite3支持的数据类型 NULL INTEGER REAL TEXT BLOB 但实际上,sqlite3也接受如下的数据类型: smallint 16 位元的整数。 interger 32 位元的整数。 decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值&…

Element el-switch 组件样式修改 将文字显示到组件内

Element el-switch 现在的样式无法将文字显示到组件内 &#xff0c;需要自己修改样式。具体如下 <el-switch:disabled"sitem.select.length-1"class"switch"v-model"sitem.or"active-color"#13ce66"inactive-color"#409EFF&qu…

jquery中输入验证中一个不错的效果

在表单的输入验证中&#xff0c;经常要当用户没能正确输入后&#xff0c;要提示“XXXX输入错误”这一类的信息&#xff0c;如何能搞到动态一点呢&#xff0c;今天发现jquery中的一个不错的效果&#xff0c;笔记之。 1 包含jquery <script src"images/jquery-1.2.6.min…

【2018.2.25】c++预习练习

学了一学期c语言之后预习c&#xff0c;一些最基础的东西做起来还是得心应手的&#xff0c;先练练手感?C primer plus 和教材同步学习&#xff0c;大概会比上学期抓瞎学习要好得多吧。 1 #include<iostream>2 int main()3 {4 using namespace std;5 cout <<…

在做项目中遇到的JS问题

name和value&#xff1a; 例如: <input type"text" name"txt"/> name用于定义这个input收到的值的变量名&#xff0c;在上面的input输入“hello",那么就有txt"hello";用于dom操作取值 在用js改变某个div属性进行传值操作时&#xff0…

用Duplex实现消息广播

http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx WCF中定义3种消息交换模式&#xff1a; 1. Request/Reply; 2. One-Way; 3. Duplex。 Request/Reply 是缺省模式&#xff0c;即同步调用。在调用服务方法后需要等待服务的消息返回&#xff0c;即便该方法返…

mongoose手动生成ObjectId

如果需要手动生成使用mongoose.Types.ObjectId()方法。 var mongoose require(mongoose); var id mongoose.Types.ObjectId();

Coolpad F61刷机解锁成功

这几天是高校开学的日子,各大运营商纷纷进驻校园,打出种种优惠,抢新鲜用户。 我一直觉得我现在的移动号码收费太贵,每个月不知不觉就是100多块,对我这个以公司为家(公司电话就是我的电话)的宅人而言,是有点夸张了。特别是和国外的运营商相比&#xff0c;如果你有朋友在国外&…

Django 数据库

一、操作数据库 Django配置连接数据库&#xff1a; 在操作数据库之前&#xff0c;首先先要连接数据库。这里我们以配置MySQL为例来讲解。Django连接数据库&#xff0c;不需要单独的创建一个连接对象。只需要在settings.py文件中做好数据库相关的配置就可以了。示例代码如下&…

MapReduce 中 UDF、UDAF、UDTF

UDF UDF只能实现一进一出的操作&#xff0c;如果需要实现多进一出&#xff0c;则需要实现UDAFUDF函数可以直接应用于select语句&#xff0c;对查询结构做格式化处理后&#xff0c;再输出内容 UDAF UDFA是用户自定义的聚类函数&#xff0c;是基于表的所有记录进行的计算操作 …

计算机网络面试知识总结1

1.TCP报头格式 TCP协议头至少20个字节 &#xff08;1&#xff09;源端口 16位&#xff0c;主要用于标志报文的返回地址&#xff0c;其中包含初始化通信的端口 &#xff08;2&#xff09;目的端口 16位&#xff0c;指明了要把数据传送到哪 &#xff08;3&#xff09;序列号 32位…

C# 导出到Excel (使用NPOI 1.2.4)

最近研究下用C#导出Excel。最后选择要用NPOI来导出。在网上看到了好多的教程啊。于是我兴奋的模仿起来了。先创建个空的excel试试吧。结果&#xff1a;提示无法将类型“NPOI.SS.UserModel.Sheet”隐式转换为“NPOI.HSSF.UserModel.HSSFSheet”。存在一个显式转换(是否缺少强制转…

Putty 工具 保存配置的 小技巧

用Putty 已经很长时间了&#xff0c;但一直被一个问题困扰&#xff0c;有时候是懒得去弄&#xff0c;反正也不怎么碍事&#xff0c;今天小研究了下&#xff0c;把这个问题解决了&#xff0c;心里也舒服了。 Putty是一个免费小巧的Win32平台下的telnet,rlogin和ssh客户端。 它的…

PyODPS 学习 实现查询数据 并更新数据

PyODPS是MaxCompute的Python版本的SDK&#xff0c;提供简单方便的Python编程接口。PyODPS支持类似Pandas的快速、灵活和富有表现力的数据结构。您可以通过PyODPS提供的DataFrame API使用Pandas的数据结果处理功能。本文用于帮助您快速开始使用PyODPS&#xff0c;并且能够用于实…

跟面向对象卯上了,看看ES6的“类”

上回我们说到ES5的面向对象&#xff0c;以及被大家公认的最佳的寄生组合式继承。时代在进步&#xff0c;在ES6中对于面向对象这个大boss理所应当地进行了一次大改&#xff0c;从原先那种比较长的写法转变为“小清新”写法。我们一起来看一下。 在ES6中是有类这个概念&#xff0…

JS数组去重精简版

看了很多人写的好几个去重方法&#xff0c;我在这里精简组合下&#xff0c;适用于已排序与未排序的数组。 废话不多说&#xff0c;上代码。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>数组去重</title></hea…

[Buzz.Today]2011.05.25

>> VMWare的Open Source Pass - CloudFoundry VMWare推出了开源Pass&#xff1a;CloudFoundary&#xff0c;但是现在只是支持少数几种语言与环境&#xff1a;Java Spring, ROR and Node.JS。。 Source Code on GitHub: https://github.com/cloudfoundry 随便瞄了两眼&…

NeHe OpenGL第三十九课:物理模拟

NeHe OpenGL第三十九课&#xff1a;物理模拟 物理模拟简介: 还记得高中的物理吧&#xff0c;直线运动&#xff0c;自由落体运动&#xff0c;弹簧。在这一课里&#xff0c;我们将创造这一切。 物理模拟介绍 如果你很熟悉物理规律&#xff0c;并且想实现它&#xff0c;这篇文章…

max(min)-device-width和max(min)-width的区别

max-device-width和max-width的区别表现在如下几个方面&#xff1a; 1. max-device-width是设备整个显示区域的宽度&#xff0c;例如&#xff0c;真实的设备屏幕宽度。 2. max-width是目标显示区域的宽度&#xff0c;例如&#xff0c;浏览器宽度。 3. 如果使用max-device-width…

一篇文看懂Hadoop

我们很荣幸能够见证Hadoop十年从无到有&#xff0c;再到称王。感动于技术的日新月异时&#xff0c;希望通过这篇内容深入解读Hadoop的昨天、今天和明天&#xff0c;憧憬下一个十年。 本文分为技术篇、产业篇、应用篇、展望篇四部分 技术篇 2006年项目成立的一开始&#xff0c;“…