net(网络)
net.Server 类#
这个类用于创建 TCP 或 [IPC][] server。
new net.Server([options][, connectionListener])#
- 返回: <net.Server>
查看 [net.createServer([options][, connectionListener])][net.createServer()].
net.Server is an [EventEmitter][]实现了以下事件:
'close' 事件#
当server关闭的时候触发. 注意,如果有连接存在, 直到所有的连接结束才会触发这个事件
'connection' 事件#
- <net.Socket> connection 对象
当一个新的connection建立的时候触发. socket 是一个 net.Socket的实例对象.
'error' 事件#
当错误出现的时候触发. 不同与 [net.Socket][], ['close'][] 事件不会在这个事件触发后继续触发 除非 [server.close()][] 是手动调用. 在 [server.listen()][]中的例子.
'listening' 事件#
当服务被绑定后调用 [server.listen()][].
server.address()#
如果在IP socket上监听,则返回绑定的ip地址, 地址族和操作系统报告的服务端口 在找到操作系统分配的地址时,找到指定的端口是有用的.返回一个有 port, family, 和 address 属性: { port: 12346, family: 'IPv4', address: '127.0.0.1' }的对象
对于在管道或UNIX域套接字上侦听的server,该名称将返回为字符串
例子:
const server = net.createServer((socket) => {
socket.end('goodbye\n');
}).on('error', (err) => {
// handle errors here
throw err;
});
// grab an arbitrary unused port.
server.listen(() => {
console.log('opened server on', server.address());
});
只有到了 'listening' 事件被触发时候.才可以调用 server.address()
server.close([callback])#
- 返回: <net.Server>
停止 server接受建立新的connections并保持已经存在的connections.此功能是异步的,当所有的connections关闭同时server响应 ['close'][]事件的时候,server将会最终关闭. 一旦'close'发生将会调用可选的回调函数. 与该事件不同, 如果服务器在关闭时未打开,则将使用错误作为唯一参数。
返回 server。
server.connections#
server.getConnections()][] 来替代。服务器上并发的连接数。
当发送一个 socket 给用child_process.fork() 创建的子进程时,这会返回 null 。要轮询分叉(forks)获得活动连接数可以使用异步的server.getConnections()来替代。
server.getConnections(callback)#
- Returns <net.Server>
异步获取服务器的当前并发连接数。当 socket 被传递给子进程时工作。
回调函数的两个参数是 err 和 count。
server.listen()#
为 connections 启动一个 server 监听. 一个 net.Server 可以是一个 TCP 或者 一个 [IPC][] server,这取决于它监听什么。
可能的参数:
- [
server.listen(handle[, backlog][, callback])][server.listen(handle)] - [
server.listen(options[, callback])][server.listen(options)] - [
server.listen(path[, backlog][, callback])][server.listen(path)] for [IPC][] servers - [
server.listen([port][, host][, backlog][, callback])][server.listen(port, host)] for TCP servers
这个函数是异步的。当 server 开始监听,['listening'][] 事件会触发。最后一个参数 callback 将会被添加为['listening'][] 事件的监听器。
所有的 listen() 方法可以传入一个 backlog 参数来指定待连接队列的最大长度。 实际长度将通过 OS 的 sysctl 设置, 例如 linux 里的 tcp_max_syn_backlog 和 somaxconn。 这个参数的默认值是511 (不是512)
说明:
-
所有的 [
net.Socket][] 都被设置为SO_REUSEADDR(详见 [socket(7)][]) -
server.listen()方法可能会被调用多次。每个后续的调用都将使用其提供的选项重新打开服务器。
监听时,其中一个最常见的错误是 EADDRINUSE。这是因为另一个 server 已经监听了该请求中的 port / path / handle。 处理这种情况的一种方法是在一定时间后重试:
server.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
console.log('Address in use, retrying...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});
______________________________________________________________________________________________________________________
net.Socket 类#
这个类是 TCP 或 UNIX Socket 的抽象(在Windows上使用命名管道,而UNIX使用域套接字)。一个net.Socket也是一个[duplex stream][],所以它能被读或写,并且它也是一个[EventEmitter][]。
net.Socket可以被用户创建并直接与server通信。举个例子,它是通过[net.createConnection()][]返回的,所以用户可以使用它来与server通信。
当一个连接被接收时,它也能被Node.js创建并传递给用户。比如,它是通过监听在一个[net.Server][]上的['connection'][]事件触发而获得的,那么用户可以使用它来与客户端通信。
new net.Socket([options])#
创建一个 socket 对象。
options<Object> 可用选项有:- Returns: <net.Socket>
新创建的 socket 可以是 TCP socket 也可以是 [IPC][] 端点流,取决于它连接 [connect()][socket.connect()] 到什么。
'close' 事件#
had_error<boolean> 如果 socket 有传输错误就为 true。
一旦 socket 完全关闭就发出该事件。参数 had_error 是 boolean 类型,表明 socket 被关闭是否取决于传输错误。
'connect' 事件#
'data' 事件#
当接收到数据的时触发该事件。data 参数是一个 Buffer 或 String。数据编码由 socket.setEncoding() 设置。(在 [Readable Stream][] 章节查看更多信息。)
注意当 Socket 发送 data 事件的时候,如果没有监听者数据将会丢失。
socket.write(data[, encoding][, callback])#
在 socket 上发送数据。第二个参数制定了字符串的编码 - 默认是 UTF8 编码。
如果全部数据都成功刷新到内核的缓冲则返回 true。如果全部或部分数据在用户内中排队,则返回 false。当缓冲再次空闲的时候将触发 ['drain'][] 事件。
当数据最终都被写出之后,可选的 callback 参数将会被执行 - 可能不会立即执行。
_________________________________________________________________
node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口。
一、创建服务器并监听端口
const net = require('net');//创建一个tcp服务//参数一表示创建服务的一些配置//参数二表示 事件 'connection' 监听回调函数let server = net.createServer({ //表示是否允许一个半开的TCP连接,默认为false allowHalfOpen: false, //一旦来了连接,是否暂停套接字,默认为false pauseOnConnect: false});server.listen(6666);//一个新的连接建立时触发 'connection' 事件server.on('connection', function (socket) { //注意这里的socket是一个流,既可以读,也可以写 //当我们监听 'data' 事件后,系统就会不断的从流中读取数据 socket.on('data', function (data) { console.log('服务器接收到 : ', data.toString()); });});//服务调用 server.listen() 监听后就会触发该事件server.on('listening', function () { // address() 方法返回服务器地址信息对象 let addr = server.address(); console.log(`服务器监听 : ${addr.port} 端口`);});//服务关闭时触发,如果还有连接存在,则直到所有连接结束才会触发该事件server.on('close', function () { console.log('服务关闭');});//出现错误时触发server.on('error', function (err) { console.log(err);});const net = require('net');let server = net.createServer();server.listen(6666, '0.0.0.0', function () { console.log('服务器监听开始');});//一个新的连接建立时触发 'connection' 事件server.on('connection', function (socket) { //获取当前服务器的连接数 server.getConnections(function (error, count) { console.log('当前服务器的连接数 : ', count); }); socket.on('data', function (data) { console.log('服务器接收到 : ', data.toString()); });});server.on('close', function () { console.log('服务器被关闭');});//5秒后手动关闭服务器,拒绝所有连接请求,已有连接全部关闭后,触发 'close' 事件setTimeout(function () { server.close();}, 5000);const net = require('net');let server = net.createServer();server.listen(6666, '0.0.0.0', function () { console.log('服务器监听开始');});server.on('connection', function (socket) { //获取当前服务器的连接数 server.getConnections(function (error, count) { console.log('当前服务器的连接数 : ', count); }); console.log('客户端信息 : ', socket.address()); //接收到数据时触发 socket.on('data', function (data) { //我们可以从流中读取数据 console.log('服务器接收到 : ', data.toString()); console.log('累计接收的数据大小 : ', socket.bytesRead); console.log('累计发送的数据大小 : ', socket.bytesWritten); //也可以向流中写入数据 let flag = socket.write(`服务器向你发送 : ${data.toString()} \r\n`); console.log('flag : ', flag); console.log('当前已缓冲并等待写入流中的字节数 : ', socket.bufferSize); }); //连接关闭时触发 socket.on('end', function () { console.log('客户端关闭'); }); //连接完全关闭时触发 socket.on('close', function () { console.log('客户端完全关闭'); }); //发生错误时触发 socket.on('error', function (err) { console.log(err); });});