深入浅出NodeJS——网络编程

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

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

TCP服务

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——网络编程,布布扣,bubuko.com

时间: 2024-10-12 02:59:17

深入浅出NodeJS——网络编程的相关文章

深入浅出NodeJS——异步编程

函数式编程 Javascript中函数作为一等公民,函数看成普通对象,可以作为参数或者返回值. 高阶函数:函数作为参数或者将函数作为返回值的函数 异步编程优势 基于事件驱动的非阻塞I/O模型 异步编程难点 (1) 异常处理,通常try/catch不一定适用,因为callback并不是在当前Tick中执行. Node在异常处理中约定将异常作为回调函数的第一个实参传回. (2)  函数嵌套过深 (3) 代码阻塞:没有sleep函数,通过setInterval()和setTimeout()模拟 (4)

nodejs——网络编程模块

net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法.dgram模块用于UDP网络编程. 参考链接:https://nodejs.org/api/net.html, https://nodejs.org/api/dgram.html 一.TCP Server net模块通过net.createServer方法创建TCP服务器,通过net.connect方法创建客户端去连接服务器. 1.通过net模块创建一个TCP Server // server.js var

nodejs学习笔记之网络编程

了解一下OSI七层模型 OSI层 功能 TCP/IP协议 应用层 文件传输,电子邮件,文件服务,虚拟终端  TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化,代码转换,数据加密 - 会话层 数据格式化,代码转换,数据加密 - 传输层 提供端对端的接口 TCP,UDP 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU 物理层  以二

深入浅出Nodejs读书笔记(转)

原文来自我的博客:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过Node方面的小项目的同学阅读,看完以后你的思维会有很奇特的碰撞,我看的时候就常常会有这样

深入浅出Nodejs读书笔记

深入浅出Nodejs读书笔记 转:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html category:node学习笔记       2015-03-01 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过No

深入浅出NodeJS——内存控制

基于无阻塞.事件驱动建立的Node服务,具有内存消耗低的优点,非常适合处理海量的网络请求. V8的垃圾回收机制与内存限制 Javascript和Java类似,由垃圾回收机制来进行自动内存管理,而Node是构建在V8虚拟机基础上,所以其内存回收和V8运行机制息息相关. V8的内存限制:64位系统约为1.4GB.32位系统约为0.7GB process.memoryUsage(),返回值包括heapTotal代表已申请到的堆内存,heapUsed当前使用的内存,rss(resident set si

深入浅出NodeJS——Buffer

Javascript对字符串处理十分友好,无论是宽字节还是单字节字符串,都被认为是一个字符串.Node中需要处理网络协议.操作数据库.处理图片.文件上传等,还需要处理大量二进制数据,自带的字符串远不能满足这些要求,因此Buffer应运而生. Buffer结构 Buffer是一个典型的Javascript和C++结合的模块,性能相关部分用C++实现,非性能相关部分用javascript实现. Node在进程启动时Buffer就已经加装进入内存,并将其放入全局对象,因此无需require Buffe

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

深入浅出NodeJS——异步I/O

底层操作系统,异步通过信号量.消息等方式有着广泛的应用. PHP语言从头到尾都是以同步阻塞方式运行,利于程序员顺序编写业务逻辑. 异步I/O.事件驱动.单线程构成Node的基调. why异步I/O (1).用户体验 在Web2.0中Ajax广泛应用异步刷新机制可以更好的提高用户体验,消除UI阻塞.后端同样采用异步I/O可以有效较少同时请求多个资源的效应时间其为max(M,N). (2).资源分配 多任务主流方式: a. 单线程异步I/O b. 多线程并行 多线程的代价在于创建线程和执行期线程上下