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模块的细节,当然也会通过例子进行说明。