深入Node TCP模块的理解

在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]);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/40b35ab65bf469de91aae6befe798c52.html