Node.js网络通信模块实现分析
序
想必我们在使用Node.js的时候应该最频繁的创建http服务,所以每个Web开发工程师都有必要学习Node.js的网络相关模块.
Node.js的网络模块架构
在Node.js的模块中,与网络相关的模块有net、DNS、HTTP、TLS/SSL、HTTPS、UDP/Datagram,另外与v8相关的网络模块有tcp_wrap.cc、udp_wrap.cc、pipe_wrap.cc、stream_wrap.cc等。在Javascript层和c。
网络模块
Net模块为底层提供了一些网络通信接口,包括创建服务器和客户端。HTTP模块也是基于net模型的上层封装,主要提供Net。服务器和网络。Net模块中的套接字。
创建TCP服务器
要创建一个TCP服务器,可以使用构造函数new net。两种方法都返回一个网络。服务器类,并可以接收两个可选参数。
var net=required(' net ');var server=net . createserver(function(socket){ socket。on('data ',function(data){ console . log(' socket data ',data . tostring());socket . write(data . tostring());}) .on('end ',function(){ console . log(' socket end ')})。on('error ',函数(error){ console . log(' socket error ',error);});});server.listen(56200,function(){ console . log(' server run at ',server . address());});server.on('error ',function(err){ throw err;});//执行后:在{地址:' :3360 ',家族:' IPv6,端口: 56200}运行的服务器,如果监听时没有指定端口,会自动随意监听某个端口。创建TCP服务器后,使用tenlent 0.0.0.0 56200。链接后,通过createServer实例化一个服务后,服务会监听客户端的请求,与客户端建立链接后,会抛出链接网。回调中的套接字对象。
创建一个TCP客户端
可以使用构造函数new net创建一个TCP客户端链接。Socket或其工厂方法net.createConnection和一个net。套接字实例将在成功创建后返回。
var net=required(' net ');var client=net . create connection({ port :56200,host : ' localhost ' });client.on('connect ',function(){ console . log(' client connect ');});client.on('data ',function(data){ console . log(' client data ',toString());});client.on('error ',function(error){ throw error;});client.on('close ',function(){ console . log(' client close ');});窝
这里就不细说什么插座了。在这里,我将主要了解net的使用。Socket,主要提供一些方法和监控事件。
相依事件
当客户端和服务器成功建立链接时,将触发Connect :如果链接失败,服务器直接抛出一个错误事件error,然后退出节点进程。数据:在客户端收到服务器发送的数据或客户端发送给服务器的数据时触发回调。当对方发送的FIN包断开时,触发End :默认情况下(allowHalfOpen==false),套接字会自毁(如果数据包写入待处理队列后还没有正式响应),但我们可以将allowarfopen参数设置为true,这样就可以继续将数据写入套接字,但需要我们自己调用end方法来消耗套接字,否则句柄可能会泄露。链接断开时触发Close :但如果传输过程中出现错误,回调函数中会抛出错误。当套接字空闲时,会触发超时:如果它在队列中被销毁,您需要手动调整关闭方法。当查找:域名解析完成时触发。当drain :完成缓存写入时触发,可用于上传大小限制。相关法
Write() :服务器向客户端发送数据或客户端向服务器发送数据。Address() :获取服务绑定的套接字的IP地址,返回的对象有三个属性,分别是端口、主机和IPvX版本。End() :半关闭socket,会发送一个FIN包,服务器可能还会发送一些数据,或者这样调用socket.end(data,encoding)。Pause() :暂停读取数据,这可以作为上传数据的限制。继续():继续读取数据。SetEncoding() :设置数据流采集格式。SetKeepAlive() :启用/禁用保持活动功能。setnodeley():禁止Nagele算法,TCP链接默认使用Nagle算法,它们的数据在发送前会被缓存。如果为真,则每次socket.write()都会立即发送数据,默认值为真。Settimeout() :当空闲套接字处于非活动状态数秒钟后,它将收到超时事件,但套接字不会停止销毁,因此您需要手动调用end()或destroy()。指示禁止空闲超时。相关属性
缓冲区大小:当前缓存的等待发送的字符串数。BytesRead :接收的字节数。字节写入:发送的已销毁字节数:标识链接是否已断开。一旦链路断开,就没有必要使用链路传输数据。localAddress :远程客户端链接本地地址的主机。如果我们监听服务的主机是0.0.0.0,客户端链接是‘192 . 168 . 1 . 1’,最后一个值是后者。LocalPort :本地端口。远程地址:客户端IP,如果套接字被破坏,该值未定义。remoteFamily :客户端正在处理IPvX数据包返回异常
在从客户端接收到要处理的数据后,服务器进入处理阶段。如果套接字在业务逻辑处理完成之前被断开,它将直接响应错误事件并报告错误:当服务器向客户端报告时,这个套接字已经被另一部分使用。因此,在上报之前,服务器需要判断套接字是否被破坏,如果没有被破坏则返回包,如果已经断开则销毁:
var net=required(' net ');var biz=require('。/biz ');var server=net . createserver(function(socket){ socket。on('data ',function(data){ biz.do(data))。然后(function(){ if(!socket . desced){ socket . write(data . tostring());} else { //做一些报表socket . destry();} }) .catch(function(){!socket . explosed socket . end('服务器处理程序错误');});}) .on('end ',function(){ console . log(' socket end ')})。on('error ',函数(error){ console . log(' socket error ',error);});});server.listen(56200,function(){ console . log(' server run at ',server . address());});server.on('error ',function(err){ throw err;});限制客户端数据大小
限制请求大小是服务安全中不可或缺的一环。服务器无法接受客户端发送的所有无限大小的数据,限制大小是第一个阈值。
var net=required(' net ');var MAX _ REQUEST _ BYTES=2 * 1024 * 1024;//2 var server=net . createserver(function(socket){ socket。on('data ',function(data){ if(data . Bytes read MAX _ REQUEST _ BYTES){ socket . pause();socket.end('数据太大,禁止');//做点报告} })。on('end ',function(){ console . log(' socket end ')})。on('error ',函数(error){ console . log(' socket error ',error);});});server.listen(56200,function(){ console . log(' server run at ',server . address());});server.on('error ',function(err){ throw err;});以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:Node.js网络通信模块实现分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。