传输控制协议(Transmission Control Protocol,TCP)是Internet的基础协议之一,它位于IP协议之上,为应用层提供了一种可靠的传输机制,它基于三次握手协议建立连接。TCP是一种面向连接的协议,这意味着通信的两个终端之间需要建立专门的连接,该连接之间是双向的。Node.js中的net
模块提供了对TCP
协议的封装,使用net
模块可以轻松的构建一个TCP
服务器,或构建一个连接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]):创建一个到路径
path
的UNIX 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! 已与服务器断开连接