Node.js对TCP/Socket的实现之net模块的使用

 2015年08月06日    5567     声明


传输控制协议(Transmission Control Protocol,TCP)是Internet的基础协议之一,它位于IP协议之上,为应用层提供了一种可靠的传输机制,它基于三次握手协议建立连接。TCP是一种面向连接的协议,这意味着通信的两个终端之间需要建立专门的连接,该连接之间是双向的。Node.js中的net模块提供了对TCP协议的封装,使用net模块可以轻松的构建一个TCP服务器,或构建一个连接TCP服务器的客户端。

  1. 创建TCP服务端
  2. 创建TCP客户端


1. 创建TCP服务端

创建一个TCP服务器,可以使用构造函数new net.Server()或使用其工厂方法net.createServer,这两种方法都会返回一个net.Server类,可接受两个可选参数。

net.createServer([options], [connectionListener])

connectionListener, 自动给'connection'事件的添加的监听器

options,是一个可选对象,其默认值是:

{
  allowHalfOpen: false,
  pauseOnConnect: false
}
  • allowHalfOpen如果是true,当另一端socket发送 FIN 包时socket不会自动发送 FIN 包。socket变为不可读,但仍可写,你要显式的调用end()方法。
  • pauseOnConnect如果是true,当连接到来的时候相,关联的socket将会暂停。它允许在初始进程不读取数据情况下,让连接在进程间传递。调用resume()从暂停的socket里读取数据。

示例:创建一个TCP服务器

var net = require('net');
var server = net.createServer(function(connection) {
    console.log('有TCP客户端连接进入');
    connection.on('end', function() {
        console.log('客户端连接断开');
    });
    //向客户端写入数据
    connection.write('hello\r\n');
    //将客户端发来的数据原样pipe返回
    connection.pipe(connection);
});

//TCP服务器开始端口监听
server.listen(2345, function() {
    console.log('TCP服务启动');
});

上面代码创建了一个TCP服务器,该服务器会对2345端口进行监听。使用telnet工具可连接至该服务器,连接命令是:telnet localhost 2345,连接后可与服务器进行简单通信。

$ telnet localhost 2345
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello
itbilu.com --message from client  //客户端发送的信息
itbilu.com --message from client  //服务器返回的信息

TCP服务器除可以监听外,还可以监听UNIX socket。例如,要监听/tmp/echo.sock则将上述代码的server.listen部分改为:

//TCP服务器开始socket监听
server.listen('/tmp/echo.sock', function() {
    console.log('TCP服务启动');
});

使用nc工具连接至服务端,连接命令是:nc -U /tmp/echo.sock

$ nc -U /tmp/echo.sock
hello
itbilu.com --message from client  //客户端发送的信息
itbilu.com --message from client  //服务器返回的信息


2. 创建TCP客户端

除创建TCP服务端外,net模块还提供了创建TCP客户端的方法。创建TCP客户端,可以使用构造函数new net.Socket([options])或使用其工厂方法net.createConnection,或使用net.createConnection方法的别名方法net.connect,这几种方式都会返回一个net.Socket类。

net.connect(options[, connectionListener])net. createConnection(options[, connectionListener]) :创建一个新的net.Socket客户端,并连接到指定的地址和端口或UNIX socket路径。

connectionListener,添加到'connection'事件的监听器

options,创建TCP sockets客户端,选项options包括以下值:

  • port:客户端连接到的端口(必须)
  • host:客户端连接到的主机,默认'localhost'
  • localAddress:网络连接绑定的本地接口
  • family : IP 栈版本。默认 4.

对于本地域UNIX socket套接字,参数options可省略port值,但必须包括下面的值:

  • path: 客户端连接到的UNIX socket路径(必须).

通用选项:

  • allowHalfOpen: 允许半开连接,如果被设置为 true,则当另一端的套接字发送 FIN 报文时套接字并不会自动发送 FIN 报文。缺省为 false。

上面介绍的工厂方法是一个比较通用的方法,你可以使用上面两个方法从监听端口或UNIX socket套接字创建TCP sockets客户端。除上述方法外,还可以使用下面的快捷方法:

  • net.connect(port[, host][, connectListener])net. createConnection(port[, host][, connectionListener]):创建一个host主机port端口的TCP连接。如果省略 host 则默认为'localhost'connectListener 参数会被用作 'connect' 事件的监听器。
  • net.connect(path[, connectListener])net. createConnection(path[, connectionListener]):创建一个到路径 pathUNIX socket套接字连接。connectListener 参数会被用作 'connect' 事件的监听器。

示例:创建一个TCP客户端,连接到上面创建的TCP服务器:

var net = require('net');

//通过UNIX socket套接字创建客户端
// var client = net.connect({path: '/tmp/echo.sock'}, function() {
//通过端口创建客户端
var client = net.connect({port: 2345}, function() {
    console.log('已连接到服务器');
    client.write('itbilu.com!\r\n');
});

//data事件监听。收到数据后,断开连接
client.on('data', function(data) {
    console.log(data.toString());
    client.end();
});

//end事件监听,断开连接时会被触发
client.on('end', function() {
    console.log('已与服务器断开连接');
});

运行效果如下:

$ node tcpClient.js 
已连接到服务器
hello

itbilu.com!

已与服务器断开连接