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);
});
});