在Node.js中,提供了net模块用来实现TCP服务器和客户端的通信。
1.1 TCP服务器
net.createServer([options][, connectionListener])
options.allowHalfOpen 是否允许单方面连接,默认值为false
connectionListener参数用于指定当客户端与服务器建立连接时所要调用的回调函数,回调中有一个参数socket,指的是TCP服务器监听的socket端口对象
也可以通过监听connection事件的方式来指定监听函数
server.on('connection',function(socket){});
1.1.1 启动TCP服务器
可以使用listen方法通知服务器开始监听客户端的连接
server.listen(port,[host],[backlog],[callback])
port 必须指定的端口号
host 指定需要监听的IP地址或主机名,如果省略的话服务器将监听来自于任何客户端的连接
backlog指定位于等待队列中的客户端连接的最大数量,默认值为511
server.on('listening',function(){});
1.1.2 使用TCP服务器
let net = require('net'); let server = net.createServer(function(socket){ console.log('客户端已连接'); }); server.listen(8080,'localhost',function(){ console.log('服务器开始监听'); });
1.1.3 address
server.address()
port 端口号
address TCP服务器监听的地址
family 协议的版本
1.1.4 getConnections
查看当前与TCP服务器建立连接的客户端的连接数量以及设置最大连接数量
server.getConnections(callback); server.maxConnections = 2;
1.1.5 close
使用close方法可以显式拒绝所有的客户端的连接请求,当所有已连接的客户端关闭后服务器会自动关闭,并触发服务器的close事件。
server.close(); server.on('close',callback);
1.2 socket
1.2.1 address
net.Socket代表一个socket端口对象,它是一个可读可写流。
let net = require('net'); let util = require('util'); let server = net.createServer(function(socket){ server.getConnections((err,count)=>{ server.maxConnections = 1; console.log('最大连接数量%d,当前连接数量%d',server.maxConnections,count); }); let address = socket.address(); console.log('客户端地址 %s',util.inspect(address)); });
1.2.2 读取数据
let server = net.createServer(function (socket) { socket.setEncoding('utf8'); socket.on('data', function (data) { console.log('本次收到的内容为%s,累计收到的字节数是%d', data, socket.bytesRead); }); });
1.2.3 监听关闭事件
let server = net.createServer(function (socket) { socket.on('end', function () { console.log('客户端已经关闭'); }); });
1.2.4 pipe
pipe方法可以将客户端发送的数据写到文件或其它目标中。
socket.pipe(destinatin,[options]);
options.end 设置为false时当客户端结束写操作或关闭后并不会关闭目标对象,还可以继续写入数据
let net = require('net'); let path = require('path'); let ws = require('fs').createWriteStream(path.resolve(__dirname, 'msg.txt')); let server = net.createServer(function (socket) { socket.on('data', function (data) { console.log(data); }); socket.pipe(ws, { end: false }); socket.on('end', function () { ws.end('over', function () { socket.unpipe(ws); }); }); });
1.2.5 unpipe
const net = require('net'); const path = require('path'); let file = require('fs').createWriteStream(path.join(__dirname, 'msg.txt')); let server = net.createServer(function (socket) { socket.pipe(file, { end: false }); setTimeout(function () { file.end('bye bye'); socket.unpipe(file); }, 5000); // socket.on('end', function () { // file.end('bye bye'); // }); }); server.listen(8080);
1.2.5 pause&resume
pause 可以暂停 data 事件触发,服务器会把客户端发送的数据暂存在缓存区里
const net = require('net'); const net = require('net'); const path = require('path'); let file = require('fs').createWriteStream(path.join(__dirname, 'msg.txt')); let server = net.createServer(function (socket) { socket.pause(); setTimeout(function () { socket.resume(); socket.pipe(file); }, 10 * 1000); }); server.listen(8080);
1.2.6 setTimeout
let net = require('net'); let path = require('path'); let ws = require('fs').createWriteStream(path.resolve(__dirname, 'msg.txt')); let server = net.createServer(function (socket) { socket.setTimeout(5 * 1000); socket.pause(); socket.on('timeout', function () { socket.pipe(ws); }); //socket.setTimeout(0);取消超时时间的设置 }); server.listen(8080);
1.2 TCP客户端
1.2.1 创建TCP客户端
let socket = new net.Socket([options])
fd socket文件描述符
type 客户端所有协议
allowHalfOpen 是否允许半连接,服务器收到FIN包时不回发FIN包,可以使服务器可以继续向客户端发数据
socket.connect(port, host, callback); socket.on('connect', callback);
1.2.2 向服务器端写入数据、end 、error、destroy,close
write表示向服务器写入数据
end 用于结束连接
error 连接发生错误
destroy 销毁流
close 表示连接关闭成功,hasError=true代表有可能有错误
socket.write(data,[encoding],[callback]);