问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Nodejs学习笔记之NET模块

发布网友 发布时间:2022-04-25 16:05

我来回答

1个回答

热心网友 时间:2022-04-20 09:19

一,开篇分析
从今天开始,我们来深入具体的模块学习,这篇文章是这个系列文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中,
对NodeJS也有一个基本的认识,没事!!!趁热打铁,让我们继续将NodeJS进行到底,好了废话不多说,直接进入今天的主题
“Net模块”
,那么”Net“应该如何理解那?
它是做什么用的那?(Net模块可用于创建Socket服务器或Socket客户端。NodeJS
的数据通信,最基础的两个模块是
Net

Http,前者是基于
Tcp
的封装,后者本质还是
Tcp
层,只不过做了比较多的数据封装,我们视为表现层)。
这里参考一下NodeJS
“http.js”
中的源码:
从图中不难看出
HttpServer继承了Net类,具有了相关的通信能力,做了比较多的数据封装,我们视为更高级的表现层。
扩展知识(以下是“inherits”的源码):
复制代码
代码如下:
exports.inherits
=
function(ctor,
superCtor)
{
 
ctor.super_
=
superCtor;
 
ctor.prototype
=
Object.create(superCtor.prototype,
{
   
constructor:
{
     
value:
ctor,
     
enumerable:
false,
     
writable:
true,
     
configurable:
true
   
}
 
});
};
功能是实现继承复用。
刚才做了一个简要的概述,里面有一些常用的概念,这里做个简短的概念普及介绍:
  (1),TCP/IP------TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。
  (2),Socket------socket则是对TCP/IP协议的封装和应用(程序层面)。
  (3),Http------HTTP是应用层协议,主要解决如何包装数据。
  (4),网络七层模型------物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
  总结一下:Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。
  从而形成了我们知道的一些最基本的函数接口,比如Create、Listen、Connect、Accept、Send、Read和Write等等。
  TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口
  实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。
二,体验一把
好了,概念我们也有了,来个例子:
1,建立server.js
复制代码
代码如下:
var
net
=
require('net')
;
var
server
=
net.createServer(function(c)
{
//
Connection*
 
console.log("服务器已连接")
;
 
c.on("end",
function()
{
   
console.log("服务器已断开")
;
 
})
;
 
c.write("Hello,Bigbear
!\r\n")
;
 
c.pipe(c)
;
})
;
server.listen(8124,
function()
{
//
Listening*
 
console.log("服务器已绑定")
;
})
;
2,建立client.js
复制代码
代码如下:
var
net
=
require('net')
;
var
client
=
net.connect({
   
port:
8124
},function(){
//
connect*
 
console.log("客户端已连接")
;
 
client.write('Hello,Baby
!\r\n')
;
});
client.on("data",
function(data)
{
 
console.log(data.toString())
;
 
client.end()
;
});
client.on("end",
function(){
 
console.log("客户端断开连接")
;
})
;
分析一下:
服务端------net.createServer创建一个
TCP
服务,这个服务绑定(server.listen)在
8124
这个端口上,创建
Server
后我们看到有一个回调函数,
在调用上面函数的时候传入一个参数,这个参数也是函数,并且接受了
socket
,这个由其他方法构造的一个管道(pipe),他的作用就是用来数据交互的。
pipe
是需要
Client

Server
打招呼才能建立的,如果此刻没有客户端访问
Server,这个
socket
就不会存在了。
客户端------net.connect顾名思义,就是连接到服务端,第一个参数是对象,设置端口(port)为
8124,也就是我们服务器监听的端口,由于没有设置
host
参数,那默认就是
localhost
(本地)。

Server
中,socket
是管道的一端,而在
client
中,client
本身就是管道的一端,如果是多个客户端连接
Server,Server
会新建多个
socket,每个
socket
对应一个
client。
运行结果:
三,案例引入
(1),下面代码仅仅是服务器向客户端输出一段文本,完成服务端到客户端的单向通讯。
复制代码
代码如下:
// 
Sever
-->
Client
的单向通讯
var
net
=
require('net');
var
chatServer
=
net.createServer();
chatServer.on('connection',
function(client)
{
 
client.write('Hi!\n');
//
服务端向客户端输出信息,使用
write()
方法
 
client.write('Bye!\n');
 
client.end();
//
服务端结束该次会话
});
chatServer.listen(9000);
Telnet测试一下:telnet127.0.0.1:9000
执行
telnet后,与服务点连接,反馈
Hi!
Bye!
的字符,并立刻结束服务端程序终止连接。
如果我们要服务端接到到客户端的信息?
可以监听
server.data
事件并且不要中止连接(否则会立刻结束无法接受来自客户端的消息)。
(2),监听
server.data
事件并且不要中止连接(否则会立刻结束无法接受来自客户端的消息)。
复制代码
代码如下:
//
在前者的基础上,实现
Client
-->
Sever
的通讯,如此一来便是双向通讯
var
net
=
require('net');
var
chatServer
=
net.createServer(),   
   
clientList
=
[];
chatServer.on('connection',
function(client)
{
 
//
JS
可以为对象自由添加属性。这里我们添加一个
name
的自定义属性,用于表示哪个客户端(客户端的地址+端口为依据)
 
client.name
=
client.remoteAddress
+
':'
+
client.remotePort; 
 
client.write('Hi
'
+
client.name
+
'!\n'); 
 
clientList.push(client); 
 
client.on('data',
function(data)
{   
    
broadcast(data,
client);//
接受来自客户端的信息 
 
});
});
function
broadcast(message,
client)

   
for(var
i=0;i<clientList.length;i+=1)
{   
     
if(client
!==
clientList[i])
{     
       
clientList[i].write(client.name
+
"
says
"
+
message);   
     

   
}
}
chatServer.listen(9000);
上面是不是一个完整功能的代码呢?我们说还有一个问题没有考虑进去:那就是一旦某个客户端退出,却仍保留在
clientList里面,这明显是一个空指针。
(3),处理clientList
复制代码
代码如下:
chatServer.on('connection',
function(client)
{
 
client.name
=
client.remoteAddress
+
':'
+
client.remotePort
 
client.write('Hi
'
+
client.name
+
'!\n');
 
clientList.push(client)
 
client.on('data',
function(data)
{
   
broadcast(data,
client)
 
})
 
client.on('end',
function()
{
   
clientList.splice(clientList.indexOf(client),
1);
//
删除数组中的制定元素。
 
})
})
NodeTCPAPI已经为我们提供了
end
事件,即客户端中止与服务端连接的时候发生。
(4),优化broadcast
复制代码
代码如下:
function
broadcast(message,
client)
{
 
var
cleanup
=
[]
 
for(var
i=0;i<clientList.length;i+=1)
{
   
if(client
!==
clientList[i])
{
     
if(clientList[i].writable)
{
//
先检查
sockets
是否可写
       
clientList[i].write(client.name
+
"
says
"
+
message)
     
}
else
{
       
cleanup.push(clientList[i])
//
如果不可写,收集起来销毁。销毁之前要
Socket.destroy()

API
的方法销毁。
       
clientList[i].destroy()
     
}
   
}
 

//Remove
dead
Nodes
out
of
write
loop
to
avoid
trashing
loop
index
 
for(i=0;i<cleanup.length;i+=1)
{
   
clientList.splice(clientList.indexOf(cleanup[i]),
1)
 
}
}
注意的是一旦
“end”
没有被触发,会出现异常,所以才做优化工作。
(5),NetAPI中还提供一个
error
事件,用于捕捉客户端的异常
复制代码
代码如下:
client.on('error',
function(e)
{
 
console.log(e);
});
四,总结一下
1,理解开篇的相关概念
2,认识Http与Net模块之间的关系
3,结合本文的例子,查阅相关api去实践
4,socket客户端与服务器端之间的通信思想
5,有兴趣可以完善一下那个聊天室的例子

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见和同性发生关糸了 梦见和同性朋友发生亲密关系 学生党如何科学护肤? 学生党该怎么基础护肤? 有什么美容护肤的技巧适合学生党? 怎么@全部成员啊? 新洲摩尔城一楼小吃租金多少 武汉王家湾有哪些广场 你好 请问 晚上6点开始 学瑜伽 可以吗? 因为我想在下班时间去 锻炼锻 ... 电脑联网有哪些条件台式电脑无线上网需要具备哪些条件 在欧式装修装风格中,欧式客厅吊顶如何设计? 浅淡装修风格欧式风格有哪些优点 欧式风格的客厅怎么装修比较好 欧式楼中楼客厅怎么装修? 欧式风格客厅地砖装修效果哪种好 想要装修成欧式客厅,应该怎么装修呢? 新欧式客厅怎样装修效果好? 念珠菌阴道炎用什麽外用药治疗? 女性念珠菌感染用什么药 白色念珠菌用什么药膏擦好 念珠菌阴道炎用什么药好? 治疗念珠菌用那一种药膏 女性念珠菌用什么药 杀念珠菌用什么药物最有效 治疗念珠菌用那种药膏 妇科念珠菌怎么根治用什么药了? 生殖器念珠菌用什么药 描写雪、风、山、云的成语 念珠菌感染用什么药 开见词语 欧式客厅顶部应该怎么装修比较好 后端Node.js 与 Java 进行通信,请问有什么好的实现思路吗 欧式装修风格豪华大气,欧式客厅吊顶的特点有哪些? nodejs实现路由是通过什么模块 Node.js开发实战详解的内容简介 node.js 与 c++的通信 可以通过 net模块实现吗 nodejs 模块开发怎么调试 nodejs nodejs-websocket模块 怎么解析客户端连接信息 卡西欧指针表如何使用测速 如何鉴测卡西欧手表真假 卡西欧手表是怎么测海拔的? 卡西欧手表如何测量间断时间 请问卡西欧登山表的指针式手表怎样测量方位的? 新入手的一款卡西欧表,但是不知道怎么测量方向? 都说卡西欧旗下很多手表都可以测量气压,是真的吗? 卡西欧手表 有测心率的功能是什么型号 卡西欧的哪款手表能实时测心跳? CASIO 登山表测量气压、方位/温度、海拔的精准度怎么样? 卡西欧手表测的温度准吗? 怎么样打气球会快速又不会爆炸的方法