NodeJS的学习笔记的网络模块

NodeJS的学习笔记的网络模块
首先,开放分析

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

有一个基本的了解,无论Nodejs!!!我们将继续趁热打铁,在年底Nodejs,好了废话不多说,直接进入今天的网络模块的主题,然后净应如何理解

它是用来做什么的(网络模块可以用来创建一个套接字服务器或客户端的Socket,Nodejs数据通信的两个基本模块是网络和HTTP。前者基于TCP封装,后者主要是TCP层。它只需要大量的数据封装,我们把它作为表示层。
这里是http.js Nodejs的源代码参考
不难看出,从图HttpServer继承类,有相关的通信能力,并做了大量的数据封装。我们认为它是一个更高级的表示层。

扩展知识(以下是继承的来源):

复制代码代码如下所示:

exports.inherits =功能(医生,superctor){

ctor.super _ = superctor;

ctor.prototype = object.create(superctor.prototype,{

构造函数:{

使用价值,

枚举:假,

可写的:真的,

配置:真

}

});

};
其功能是实现继承重用。

我只是简要概述了一些常用的概念。下面是这个概念的简单介绍

(1)TCP/IP协议是一种传输层协议,主要解决网络中的数据传输问题。

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

(3)HTTP——HTTP是一个应用层协议,主要解决如何打包数据。

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

总之,套接字是TCP/IP协议的封装,套接字本身不是协议,而是一个调用接口(API)。

因此,我们已经形成了我们所知道的一些最基本的函数接口,如创建、监听、连接、接受、发送、读取和写入等。

TCP/IP只是一个协议栈,就像操作系统的操作机制一样,它必须实现,并且还提供了外部操作界面

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

二,经验一

好了,我们有了这个概念,下面是一个例子:

1,建立的server.js

复制代码代码如下所示:

无功网=需要('net);

VaR服务器= net.createserver(功能(C){ / /连接。

console.log(服务器已连接);

C.on(结束

console.log(服务器已断开连接);

});

c.write(你好,只大熊!;

C.pipe(C);

});

server.listen(8124),功能({ / /听。

console.log(服务器已经绑定);

});
2,建立的client.js

复制代码代码如下所示:

无功网=需要('net);

VAR客户= net.connect({

端口:8124

(函数)}。

console.log(客户端已连接);

client.write(你好,宝贝!');

});

client.on(数据

console.log(data.tostring());

Client.end();

});

client.on(结束

console.log(客户端断开连接);

});
分析:

服务器------net.createserver创建一个TCP服务。8124端口上的服务绑定(服务器监听)创建服务器。之后,我们将看到回调函数。

调用上面的函数时,会引入一个参数。这个参数也是一个函数。它接受套接字,由其他方法构建的管道。它的功能是与数据交互。

管道需要调用客户机和服务器。如果此时没有客户端访问服务器,则该套接字将不存在。
客户------net.connect,顾名思义,是连接到服务器端。第一个参数是对象。设置端口(端口)是8124,这是我们的服务器监听的端口。因为没有设置主机参数,默认本地(局部)。

在服务器端,套接字是管道的一端,在客户端中,客户端本身就是管道的一端。如果多个客户机连接服务器,服务器将创建更多的套接字,每个套接字对应一个客户机。
运行结果:
三,案例介绍

(1)下面的代码仅是向客户端输出文本以完成服务器与客户机之间的单向通信的服务器。

复制代码代码如下所示:

服务器/客户机/单向通信

无功网=需要('net);

VaR ChatServer = net.createserver();

chatserver.on(连接功能(客户端){

client.write(嗨!);使用写入(方法)将服务器输出到客户端输出信息

client.write('bye!');

(客户机端);会话的服务器端

});

(9000)chatserver.listen;
telnet127.0.0.1:9000 telnet测试:

执行telnet之后,连接服务点,反馈HI的字符!再见!立即终止服务器端连接。

如果我们想让服务器接收到客户端的信息

你可以听server.data事件和不停的连接(否则来自客户端的信息将不会被立即接受,)。

(2),听server.data事件和不停的连接(否则来自客户端的信息将不会被立即接受,)。

复制代码代码如下所示:

在前者的基础上,实现了客户端>服务器的通信,是双向通信。

无功网=需要('net);

VaR ChatServer = net.createserver(),

clientlist = { };

chatserver.on(连接功能(客户端){

可以将属性添加到一个自由对象中。在这里我们添加了一个自定义属性名称来表示哪个客户机(客户端的地址+端口是基于)

client.name = client.remoteaddress +:+ client.remoteport;

client.write('嗨' client.name + +!');

ClientList.push(客户端);

Client.on(数据功能(数据){

广播(数据,客户机);从客户端接收信息

});

});

函数广播(消息,客户端){

对于(var i = 0;i < clientlist.length;我+ = 1){

如果(客户端)!= clientlist {我}){

我clientlist { }。写(client.name +说+信息);

}

}

}

(9000)chatserver.listen;
上面是完整的函数代码吗我们说还有一个问题,是不是考虑:即一旦客户退出,它仍然在clientlist,这显然是一个空指针。

(3)处理clientlist

复制代码代码如下所示:

chatserver.on(连接功能(客户端){

client.name = client.remoteaddress +:+ client.remoteport

client.write('嗨' client.name + +!');

ClientList.push(客户端)

Client.on(数据功能(数据){

广播(数据,客户)

})

Client.on(函数(){(){

clientlist.splice(clientlist.indexof(客户端),1); / /删除数组元素。

})

})
nodetcpapi为我们提供了最后的事件,它发生时,客户端与服务器的连接。

(4)广播优化

复制代码代码如下所示:

函数广播(消息,客户端){

var清理{ }

对于(var i = 0;i < clientlist.length;我+ = 1){

如果(客户端)!= clientlist {我}){

如果(clientlist {我},{ / /写)是否可以写下第一个检查插座

我clientlist { }。写(client.name +说+信息)

{人}

Cleanup.push(clientlist {我}) / /如果不写,收集和destroyed.socket.destroy()应该被API毁灭之前。

clientlist {我}破坏()。

}

}

} / /删除死节点出写回路避免破坏循环索引

为(i = 0;i < cleanup.length;我+ = 1){

clientlist.splice(clientlist.indexof(清理{我}),1)

}

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

(5)一个错误事件也提供在NetAPI捕捉到客户的例外

复制代码代码如下所示:

Client.on(错误,函数(e){

console.log(E);

});
四,总结

1,了解开头的概念

2,了解HTTP和网络模块之间的关系

3,结合本文的例子,请参考相关的API来实践。

4,socket客户端与服务器端的通信思想

5,我对改进聊天室的例子很感兴趣。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部