首先,开放分析
从今天开始,我们将深入
学习具体的模块。本文是本系列文章的第三篇。前两章主要以理论为基础。我相信你是在前两章的学习中。
有一个基本的了解,无论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,我对改进
聊天室的例子很感兴趣。