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简单实现中英文翻译
May 04 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 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
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
linux中cd命令使用详解
2015/01/08 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
为数据库创建索引都需要注意些什么
2012/07/17 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
计算机专业推荐信范文
2013/11/20 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
科学发展观演讲稿
2014/09/11 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
怎样写辞职信
2015/02/27 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript