Node.js API实例讲解——node.js网络模块
node.js网络模块
如果对网络知识了解的可以略过本节。
这里先回顾一下必要的网络基础知识,不会讲历史,而是抓重点,目的是更好的使用node.js的网络模块。
通过网络可以让电脑相互连接,从而相互传递信息。这个过程,就需要知道彼此的地址,这个地址就是IP。数据传输的方式,分为TCP和UDP,TCP可以理解为可靠性交流,确保数据完整性的方式,UDP就比较随意,不和对方打招呼,直接把数据通过IP地址丢给对方。socket是建立在TCP和IP之上的,可以理解为一个空洞和管道,通过它发送数据和接收数据。HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP。好了,不讲太多,下面看一下node.js中对应这些概念的模块有哪些。
net模块
通过 var net = require("net"); 方式导入net模块。
net模块可以建立TCP的服务器端和Socket客户端。
http模块
通过这个模块是建立http的服务器端和客户端,http模块建立在net模块之上。
https模块
通过这个模块可以建立https的服务器端和客户端,https模块建立在http模块和tls模块之上(tls模块在“加密解密”一章有详解)
dgram模块
这个模块对应的就是UDP协议的操作。
Socket是什么
所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
形象的描述是,socket是一个管道两端的口,当客户端和服务器建立连接后,这个管道就形成了,那么两端可以通过socket(口)写入和读取数据到另一端。
先写一个服务器端程序
var net = require('net'); var server = net.createServer(function(socket) { console.log('有客户进入'); // 和客户端打招呼 socket.write('你好啊!'); // 打印客户端发送来的信息 socket.on("data",function(data){ console.log(data.toString()); }) // 监听 error 或 end事件 socket.on("error",function(){ console.log("客户已断开") }) socket.on("end",function(){ console.log("客户已断开") }) }); // 服务器监听8124端口,等待客户访问 server.listen(8124, function() { console.log('服务器已启动!'); });
再建立个客户端程序
var net = require('net'); var socket = net.connect({port: 8124}, function() { console.log('链接服务器成功!'); process.stdin.on("data",function(str){ // 当输入quit时关闭客户端 if(str.toString("utf8").trim() == "quit"){ process.exit(1); // 退出客户端 }else{ // 把数据发送到服务器端。 socket.write(str); } }) } ); socket.on('data', function(data) { // 服务器发来的信息 console.log(data.toString()); });
先启动服务器程序,会打印出
服务器已启动!
这个时候还没客户访问,server.listen 方法内的回调函数是当服务器启动成功后被调用。
然后再启动客户端程序,服务器程序会打印出:
有客户进入
这说明服务器代码的 net.createServer的回调函数,是当有客户端访问时会调用;回调函数参数socket是与访问者建立的通道,是一个net.Socket对象。
再来看看客户端程序,程序运行时,会打印:
链接服务器成功! 你好啊!
net.connect方法可以创建客户端socket对象,当与服务器连接成功后,会调用它的回调方法。good
服务器端通过socket给客户端传输“你好啊!”问候语,客户端通过监听data事件,得到了这个信息并打印出来。
在客户端输入“HI”回车,这时服务器端会打印出“HI”。这是通过监听 process.stdin 标准输入的 data事件,得到数据后,通过socket.write发送给服务器端。
当在客户端输入“quit”时,会调用process.exit(1)关闭客户端程序,而服务器端通过socket.on("error")监听到客户端退出,并打印出“客户端已断开”。
通过以上分析,知道了客户端和服务器端通过socket彼此读取和发送信息,socket有很多事件,通过监听这些事件可以得知彼此的状态,从而做出反应。
yellow本节只要知道大概概念即可,多动手,模仿着写一些代码会更好。下面几节,会详细的介绍net模块的细节,当然也会通过例子进行说明。