深入Node TCP模块的理解(2)

let net = require('net'); let server = net.createServer(function (socket) { console.log("客户端已经连接"); socket.setEncoding('utf8'); socket.on('data', function (data) { console.log("已接收客户端发送的数据:%s", data); socket.write('服务器:' + data); }) socket.on('error', function (err) { console.log('与客户端通信过程中发生了错误,错误编码为%s', err.code); socket.destroy(); }); socket.on('end', function (err) { console.log('客户端已经关闭连接'); socket.destroy(); }); socket.on('close', function (hasError) { console.log(hasError ? '异常关闭' : '正常关闭'); }); }); server.listen(808, function () { let client = new net.Socket(); client.setEncoding('utf8'); client.connect(808, '127.0.0.1', function () { console.log('客户端已连接'); client.write('hello'); setTimeout(function () { client.end('byebye'); }, 5000); }); client.on('data', function (data) { console.log('已经接收到客户端发过来的数据:%s', data); }); client.on('error', function (err) { console.log('与服务器通信过程中发生了错误,错误编码为%s', err.code); client.destroy(); }); });

1.2.3 close

停止server接受建立新的connections并保持已经存在的connections

server.getConnections((err, count) => { if (count == 2) server.close(); });

1.2.4 unref&ref

unref方法指定发客户端连接被全部关闭时退出应用程序 如果将allowHalfOpen方法,必须使用与客户端连接的socket端口对象的end 方法主动关闭服务器端连接

let net = require('net'); let server = net.createServer({ allowHalfOpen: true }, function (socket) { console.log("客户端已经连接"); socket.setEncoding('utf8'); socket.on('data', function (data) { console.log("已接收客户端发送的数据:%s", data); socket.write('服务器确认数据:' + data); }) socket.on('error', function (err) { console.log('与客户端通信过程中发生了错误,错误编码为%s', err.code); socket.destroy(); }); socket.on('end', function (err) { console.log('客户端已经关闭连接'); socket.end(); server.unref(); }); socket.on('close', function (hasError) { if (hasError) { console.log('由于错误导致socket关闭'); server.unref(); } else { console.log('端口正常关闭'); } }); server.getConnections((err, count) => { if (count == 2) server.close(); }); }); server.listen(808, function () { }); server.on('close', function () { console.log('服务器关闭'); });

1.2.5 bufferSize

write的返回值和bufferSize属性值

let server = net.createServer({ allowHalfOpen: true }, function (socket) { console.log("客户端已经连接"); socket.setEncoding('utf8'); let rs = fs.createReadStream(path.resolve(__dirname, 'a.txt'), { highWaterMark: 2 }); rs.on('data', function (data) { let flag = socket.write(data); console.log("flag:", flag); console.log('缓存字节:' + socket.bufferSize); console.log('已发送字节:' + socket.bytesWritten); }) socket.on('data', function (data) { console.log('data', data); }); socket.on('drain', function (err) { "缓存区已全部发送" }); });

1.2.6 keepAlive

当服务器和客户端建立连接后,当一方主机突然断电、重启、系统崩溃等意外情况时,将来不及向另一方发送FIN包,这样另一方将永远处于连接状态。 可以使用setKeepAlive方法来解决这一个问题

socket.setKeepAlive([enaable],[initialDelay]);

enable 是否启用嗅探,为true时会不但向对方发送探测包,没有响应则认为对方已经关闭连接,自己则关闭连接

initialDelay 多久发送一次探测包,单位是毫秒

1.2.7 聊天室1.0

/** * 1.创建一个服务器 * 2. 客户端可以连接服务器 * 3.客户端可以发言,然后广播给大家 * 4.客户端连接和退出后都要通知大家。 * 5.显示当前的在线人数 */ let net = require('net'); let util = require('util'); let clients = {}; let server = net.createServer(function (socket) { server.getConnections(function (err, count) { socket.write(`weclome,there is ${count} users now,please input your username\r\n`); }); let nickname; socket.setEncoding('utf8'); socket.on('data', function (data) { data = data.replace(/\r\n/, ''); if (data == 'byebye') { socket.end(); } else { if (nickname) { broadcast(nickname, `${nickname}:${data}`); } else { nickname = data; clients[nickname] = socket; broadcast(nickname, `welcome ${nickname} joined us!`); } } }); socket.on('close', function () { socket.destroy(); }); }).listen(8088); function broadcast(nickname, msg) { for (let key in clients) { if (key != nickname) { clients[key].write(msg + '\r\n'); clients[nickname].destroy(); delete clients[nickname]; } } }

1.2.8 聊天室2.0

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

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