手机版

Nodejs学习笔记的. NET模块

时间:2021-10-15 来源:互联网 编辑:宝哥软件园 浏览:

一、开篇分析。

从今天开始,让我们深入具体的模块学习。本文是本系列的第三篇文章。前两篇文章主要以理论为基础。我相信在前两篇文章的研究中,

我对NodeJS也有基本的了解,没什么!趁热打铁,让我们继续把NodeJS进行到底。好了,废话少说,直接进入今天的话题“网络模块”。“网”应该如何理解?

它是用来做什么的?(Net模块可用于创建Socket服务器或Socket客户端。NodeJS数据通信的两个最基本的模块是Net和Http。前者是基于Tcp封装的,而后者本质上还是Tcp层,只是做了更多的数据封装,我们把它看作表示层。

这里请参考NodeJS“http . js”中的源代码:

从图中不难看出,HttpServer继承了Net类,具有相关的通信能力,并且做了更多的数据封装,我们把它看作是更高级别的表示层。

扩展知识(以下是“继承”的源代码):

复制代码如下:导出。inherits=function (ctor,super ctor) {ctor。super _=super ctorctor . prototype=object . create(superctor . prototype,{ constructor : { value : ctor,enumerable: false,writable: true,configuration ble : true } });};

功能是实现继承和重用。

刚才我做了一个简要的概述。里面有一些常用的概念。在这里,我将简单介绍一下概念普及:

(1)、TCP/IP-TPC/IP协议是一种传输层协议,主要解决如何在网络中传输数据。

(2)套接字是TCP/IP协议(程序级)的封装和应用。

(3) HTTP是应用层协议,主要解决如何封装数据。

(4)网络七层模型——物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

综上所述:Socket是TCP/IP协议的封装,Socket本身不是协议,而是调用接口(API)。

于是形成了一些基本的功能接口,如创建、监听、连接、接受、发送、读写等。

TCP/IP只是一个协议栈,就像操作系统的操作机制一样,必须具体实现,并提供外部操作接口。

其实传输层的TCP是基于网络层的IP协议,应用层的HTTP协议是基于传输层的TCP协议。套接字本身不是协议。如上所述,它只提供了一个编程TCP或UDP的接口。

第二,体验一把。

好了,我们也有概念了。让我们举个例子:

1、建立server.js

复制代码如下: var net=require(' net ');Var server=net.createserver(函数(c){//连接侦听器console.log('服务器已连接');C. on ('end ',function(){ console . log(' server disconnected ');}) ;c.write('你好,大熊!\ r \ n ');c .管道(c);}) ;Server.listen (8124,function(){//listener console . log(服务器已绑定));}) ;

2.创建客户端. js

复制代码如下: var net=require(' net ');var client=net . connect({ port : 8124 },function(){//connect listener console . log(' client connected ');客户。写信('你好,宝贝!\ r \ n ');});client.on('data ',function(data){ console . log(data . tostring());client . end();});Client.on ('end ',function(){ console . log(' client disconnected ');}) ;

分析一下:

服务器网络。

调用上述函数时,传入一个参数,也是一个函数,接受socket,一个由其他方法构造的管道,它的作用是交换数据。

只有当客户端问候服务器时,才能建立管道。如果此时没有客户端访问服务器,这个套接字将不存在。

顾名思义,Client - net.connect连接到服务器。第一个参数是一个对象,端口设置为8124,这是我们的服务器监听的端口。由于没有设置主机参数,默认情况下它是localhost。

在服务器端,套接字是管道的一端,而在客户端,客户端本身是管道的一端。如果多个客户端连接到服务器,服务器将创建多个套接字,每个套接字对应一个客户端。

运行结果:

第三,案例介绍。

(1)、下面的代码只是服务器输出一段文字给客户端,完成服务器到客户端的单向通信。

复制代码如下://服务器-客户端的单向通信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:Telnet 127 . 0 . 0 . 1:9000。

telnet执行后,连接服务点并反馈Hi!拜拜!字符,并立即结束服务器程序以终止连接。

如果我们希望服务器从客户端接收信息?

您可以监听server.data事件,不要中止连接(否则,它将立即结束来自客户端的不可接受的消息)。

(2)、监听server.data事件,不要中止连接(否则会立即结束,无法接受来自客户端的消息)。

复制的代码如下://在前者的基础上,实现了Client与Sever的通信,使双向通信为var net=require(' net ');var chatServer=net.createServer(),client list=[];Chatserver.on ('connection ',function (client) {//js可以自由添加对象的属性。在这里,我们添加了一个自定义的name属性,用于指示哪个客户端(基于客户端的地址端口)client . name=client . remote address ' : ' client . remote port;client.write('Hi ' client.name!\ n ');clientList.push(客户端);client.on('data ',function(data) { broadcast(data,client);//接受来自客户端的信息});});函数广播(消息,客户端){ for(var I=0;iclientList.lengthi=1) { if(client!==clientList[i]) { clientList[i]。write(client . name ' say ' message);} } } ChatSERVER . listen(9000);

是完整的功能代码吗?我们说还有一个没有考虑到的问题:一旦一个客户端退出,它就会保留在clientList中,这显然是一个空指针。

(3)处理客户列表。

复制代码如下:chatserver.on ('connection ',function(client){ client . name=client . remote address ' : ' client . remote portclient . write(' hi ' client . name!\ n ');client list . push(client)client . on(' data ',function(data) { broadcast(data,client) }) client.on('end ',function(){ client list . splice(client list . indexof(client),1);//删除数组中的公式元素。})})

NodeTCPAPI为我们提供了end事件,当客户端终止与服务器的连接时,就会发生该事件。

(4)优化播出。

复制代码如下:函数广播(消息,客户端){ var clean up=[]for(var I=0;iclientList.lengthi=1) { if(client!==client list[I]){ if(client list[I]。可写){//首先检查套接字是否可以写clientlist [I]。写(客户端。name ' say ' message)} else { clean up。push(client list[I])//如果没有,则收集并销毁。销毁前,Socket.destroy()应该用API销毁。clientList[i]。destroy()} } }//从写循环中移除死节点,以避免破坏(I=0;胞囊长度;I=1){ client list . splice(client list . indexof(clean up[I]),1) }}

请注意,一旦没有触发“结束”,就会出现异常,因此优化工作已经完成。

(NetAPI中还提供了一个错误事件,用于捕获客户端的异常。

复制代码如下:client.on ('error ',function(e){ console . log(e);});

第四,总结。

1、一开始就了解相关概念。

2.了解Http和Net模块之间的关系。

3.结合文中实例,参考相关api进行实践。

4.套接字客户端与服务器端的通信思想。

5.如果你感兴趣,你可以改进那个聊天室的例子。

版权声明:Nodejs学习笔记的. NET模块是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。