NodeJS学习笔记之网络编程


Posted in NodeJs onAugust 03, 2014

Node提供丰富的网络编程模块

Node模块 协议
net TCP
dgram UDP
http HTTP
https HTTPS

TCP服务事件分为下面两类

(1)、服务器事件

对于通过net.createServer()创建的服务器而言,它是一个EventEmitter实例,自定义事件有以下几种:

listening :在调用listen()绑定端口或Domain Socket后触发,简写为server.listen(port, listener),通过第二个参数传入。

connection :每个客户端套接字连接到 服务器 时触发,简洁写法为通过net.createServer(),最后一个参数传递。

close :当服务器关闭时触发,在调用server.close()后,服务器将停止接受新的套接字连接,但保持当前存在的连接,等待所有连接断开后,会触发该事件。

error :当服务器发生异常时,将会触发该事件。

(2)、连接事件

服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可写可读Stream对象。Stream对象可以用于服务端和客户端之间的通信,既可以通过data事件从一端读取另一端发来的数据,也可以通过write()方法从一端向另一端发送数据。

data :当一端调用write()发送数据时,另一端会触发data事件,事件传递的数据就是write()发送的数据

end :当连接中的任意一端发送FIN数据时,将会触发该事件。

connect :该事件用于 客户端 ,当套接字与服务器连接成功时会触发。

drain :当任意一端调用write()发送数据时,当前这端触发该事件。

error :当异常发送

close :当套接字完全关闭时触发

timeout :当一定时间后连接不再活跃时,触发该事件通知用户该连接被闲置了。

TCP针对网络中的小数据包有一定优化策略:Nagle算法,当数据达到一定量后才触发。

UDP服务

UDP称为用户数据包协议,其不是面向连接的服务。Node中UDP只是一个EventEmitter实例,而非Stream的实例,具备以下自定义事件:

(1) message :当UDP套接字监听网卡端口后,接受消息时触发,触发携带的数据为消息Buffer对象和一个远程地址信息。

(2) listening :当UDP套接字开始侦听时触发该事件。

(3) close :调用close()方法时触发该事件,并不再触发message事件。若需再次触发message事件,需要重新绑定。

(4) error :当异常发生时触发,若不监听直接抛出,使进程退出。

HTTP服务

Node中http模块继承自tcp服务器(net模块),它能与多个客户端保持连接,由于其不为每个连接创建线程,保持很低的内存占用,所以能实现高并发。HTTP服务和TCP服务区别在于,在开启keepalive之后,一个TCP会话可以用于多次请求和响应。TCP服务以connection为单位进行服务,HTTP服务以request单位进行服务。http模块是将connection到request的过程进行封装。

http模块将连接所用的套接字的读写抽象为ServerRequest和ServerResponse对象,分别对应请求和响应操作。

(1) HTTP请求

对于TCP连接的读操作,http模块将其封装为ServerRequest对象。如报头部分req.method、req.url、req.headers,报文体数据部分抽象为一个只读的流对象,若业务逻辑需要读取报文体中的数据,则需要这个数据流结束后才能进行操作。

(2) HTTP响应

HTTP响应封装了底层连接的写操作,可以将其看成一个可写的流对象。

响应报文头部信息方法:res.setHeader()和res.writeHeader()方法,可以多次setHeader进行设置,但必须调用writeHeader写入连接才生效。

报文体部分方法:res.write()和res.end()方法

(3) HTTP服务端事件

connection :客户端与服务端建立TCP连接时,触发一次connection事件

request :建立TCP连接后,http模块底层将数据流中抽象出HTTP请求和HTTP响应,当请求数据发送到服务端,在解析出HTTP请求头后触发该事件;在res.end()后,TCP连接可用于下一次请求。

close :调用server.close方法停止接收新的连接,已有的连接都断开时触发该事件。

checkContinue :某些客户端在发送较大数据时,先发送一个头部带有Expect: 100-continue的请求到服务器,服务触发该事件;

connect :当客户端发起CONNECT请求时触发

upgrade :当客户端要求升级连接的协议时,需要和服务端协商,客户端会在请求头中带上Updagrade字段

clientError :连接的客户端发送错误,错误传到服务端此时触发该事件

(4) HTTP客户端

http模块提供http.request(options, connect),用于构造HTTP客户端。

HTTP客户端和服务端类似,在ClientRequest对象中,它的事件叫做response,ClientRequest在解析响应报文的时,一解析完响应头就触发response事件,同时传递一个响应对象ClientResponse供操作,后续响应报文以只读流的方式提供。

(5) HTTP客户端事件

response :与服务端的request事件对应的客户端在请求发出后得到响应时触发该事件。

socket :当底层连接池中建立的连接分配给当前请求对象时触发;

connect :当客户端向服务器发送CONNECT请求时,若服务端响应了200状态码,客户端将会触发该事件。

upgrade :客户端享服务端发送Upgrade请求时,若服务端响应了101 Switching Protocols状态,客户端将会触发该事件。

continue :客户端向服务端发起Expect: 100-continue头信息后,以试图发送较大数据,若服务端响应100 continue状态,服务端将触发该事件

WebSocket服务

WebSocket最早是作为HTML5重要特性出现的,相比HTTP有以下优点:

(1) 客户端和服务端只建立一次TCP连接,可以使用更少的连接

(2) WebSocket服务端可以推送数据到客户端,这远比HTTP请求响应模式更灵活、更高效

(3) 更轻量级的协议头,减少数据传输

Node中没有内置WebSocket的库,但社区的ws模块封装了WebSocket的底层实现如著名的socket.io

NodeJs 相关文章推荐
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
NodeJS url验证(url-valid)的使用方法
Nov 18 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 #NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 #NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 #NodeJs
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 #NodeJs
nodejs的10个性能优化技巧
Jul 15 #NodeJs
提高NodeJS中SSL服务的性能
Jul 15 #NodeJs
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 #NodeJs
You might like
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
python实现数据库跨服务器迁移
2018/04/12 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python实现指定ip端口扫描方式
2019/12/17 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
实习单位接收函模板
2014/01/10 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
合作合同协议书范本
2015/01/27 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python