net
模块是Node.js
官方提供的用于底层网络通信的模块,包含了创建服务器/客户端的方法。
net
模块主要包含了两部分:
net.Server
用于创建 TCP 服务,内部通过 socket 来实现与客户端的通信net.Socket
是 TCP或Socket的抽象,实现了一个全双工流接口
net.Server
net.Server
用于创建 TCP 或本地服务器
net.server([options][, connectionListener])
参数说明:
- options 参数配置
- allowHalfOpen 是否允许一个半开的TCP连接。默认值为false
- highWaterMark
- pauseOnConnect 是否在一旦来了连接就暂停套接字。默认值为false
- noDelay 是否在收到新的传入连接时立即禁用 Nagle 算法 。默认值为false
- keepAlive 是否在接受到新的传入连接立即在套接字上启用保持活动功能。默认值为false
- keepAliveInitialDelay
- connectionListener 连接监听器
close
事件 server 关闭时会被触发。仅到所有连接到结束时才会触发该事件connection
新连接建立时会被触发error
当错误出现时会被触发listening
当服务被绑定后调用 server.listen() 时被触发
javascript
const net = require('net')
// 创建 net.Server 实例
const server = new net.Server()
// 监听 connection 事件(新链接建立时触发)
server.on('connection', (socket) => {
console.log("新的客户端接入")
})
// 设置监听端口
server.listen(80)
// 设置监听事件
server.on('listening', () => {
console.log('服务正在监听')
})
// 监听 close 事件(TCP服务关闭时触发)
server.on('close', () => {
console.log('服务器关闭')
})
// 监听 error 事件(TCP服务发生错误时触发
server.on('error', (err) => {
console.error("服务发生异常:" + err.message)
})
setTimeout(() => {
server.close()
}, 5000)
事件
事件 | 说明 |
---|---|
listening |
当服务器调用server.listen绑定时触发 |
connection |
新链接建立时触发 |
error |
发生错误时触发 |
close |
服务器关闭时触发 |
属性
方法 | 说明 |
---|---|
server.listening |
设置服务器是否正在监听连接 |
server.maxConnections |
设置服务器最大连接数 |
方法
server.address
server.address()
用于获取服务器监听的地址。此方法返回一个JSON 对象,该对象有三个属性:port (TCP服务器监听的端口号)、family (TCP服务监听的地址是 IPv6 还是IPv4 )、address(TCP监听的地址)
server.address()
server.close
server.close
用于服务器停止接受新链接并保持现有链接。当所有连接结束时服务器会关闭,并触发close 事件
注意:
- 正常关闭时,callback会被执行,同时会触发 close事件;
- 异常关闭时,callback也会执行,同时传入error对象参数
server.close([callback])
参数说明:
- callback 回调函数
server.getConnetions
server.getConnetions
用于异步获取服务器当前活跃连接的数量
server.getConnetions(callback)
参数说明:
- callback 回调函数
- err err 错误对象。若获取失败时,会传入错误对象;获取成功,会传入 null
- count 当前活跃连接数
server.listen
server.listen
用于配置监听
server.listen(handle[, backlog][, callback])
参数说明:
- handle 操作句柄(可以为服务器、套接字、具有文件描述符属性的对象)
- backlog 待处理连接队列最大长度
- callback 回调函数
server.listen(options[, callback])
参数说明:
- options 参数配置
- port 端口号
- host 主机名
- path 服务器监听的路径(若指定了port,则会被忽略)
- backlog 待处理连接队列最大长度
- exclusive 是否允许共享连接处理任务。默认值为false
- readableAll 对于IPC服务器,使管道对所有用户是否可读。默认值为false
- writeableAll 对于IPC服务器,使管道对所有用户是否可写。默认值为false
- ipv6Only 仅IPv6
- signal 用于关闭服务器的中止信号
- callback 回调函数
server.listen(path[, backlog][, callback])
参数说明:
- path 服务器监听的路径
- backlog 待处理连接队列最大长度
- callback 回调函数
server.listen([port[, host[, backlog]]][, callback])
参数说明:
- port 端口
- host 主机名
- path 服务器监听的路径(若指定了port,则会被忽略)
- callback 回调函数
javascript
const net = require('net')
// 创建 net.Server 实例
const server = new net.Server()
// 启动端口
server.listen(80)
// 设置监听事件
server.on('listening', () => {
console.log('服务正在监听')
let address = server.address();
console.log("服务器监听的端口:" + address.port) // 80
console.log("服务器监听的地址:" + address.address)
console.log("服务器监听的地址类型:" + address.family)
})
net.Socket
net.Socket
实例实现了一个双工流接口。可用用户创建并直接用于与服务器交互。
net.Socket([options])
参数说明:
- options 参数配置
- fd 文件描述符。若指定则使用给定的文件描述符封装现有套接字,否则创建新的套接字
- allowHalfOpen 是否允许一个半开的TCP连接。默认值为false
- readable 仅当传入 fd 时,是否允许在套接字上读取。默认为false
- writeable 仅当传入 fd 时,是否允许在套接字上写入。默认为false
- signal 销毁套接字的中止信号
服务端Socket
javascript
const net = require('net')
// 创建 net.Server 实例
const server = net.createServer((socket) => {
console.log("服务端侧的Socket >>> " + socket)
})
// 设置监听
server.listen(8888, () => {
console.log("服务器启动成功")
})
客户端Socket
javascript
const net = require('net')
// 创建 net.Socket 实例
const socket = new net.Socket()
// 建立 socket 连接
socket.connect({
host: '127.0.0.1',
port: 8888
})
事件
事件 | 说明 |
---|---|
connect |
成功建立链接时触发 |
ready |
当套接字准备好时触发(在connect之后触发) |
timeout |
socket 空闲超时时触发(需用户手动关闭 socket) |
data |
收到数据时触发 |
drain |
当写缓冲区变空时触发 |
lookup |
域名解析完成时触发 |
error |
当有错误时触发 |
end |
当 socket 另一端传输结束时触发,从而结束套接字的可读端 |
close |
连接断开时触发 |
属性
属性 | 说明 |
---|---|
socket.bufferSize |
获取写入缓冲区的字节数 |
socket.remoteAddress |
获取远程IP地址 |
socket.remoteFamily |
获取远程IP协议族(IPv4、IPv6) |
socket.remotePort |
获取远程端口 |
socket.localtAddress |
获取本地IP地址 |
socket.localPort |
获取本地端口 |
socket.bytesRead |
获取接受的字节数 |
socket.bytesWritten |
获取发送的字节数 |
socket.timeout |
设置套接字超时时间,单位毫秒 |
方法
socket.connect
socket.connect
用于创建socket连接。
socket.connect(options[, connectListener])
参数说明:
- options 参数配置
- port 端口
- host 主机地址。默认值为localhost
- localAddress 本地地址
- localPort 本地端口
- family IP栈版本。必须为4 、6 或0 。0 表示允许使用IPv4 和IPv6 。默认值为0
- keepAlive 是否保持活动。默认为false
- connectListener 连接事件
socket.connect(path[, connectListener]) // 用于 IPC 连接
参数说明:
- path 连接路径
- connectListener 连接事件
socket.connect(port[, host[, connectListener]]) // 用于 TCP 连接
参数说明:
- options 参数配置
- port 端口
- host 主机地址。默认值为localhost
- connectListener 连接事件
javascript
const net = require('net')
// 创建 net.Socket 实例
const socket = new net.Socket()
// 建立 socket 连接
socket.connect({ host: '127.0.0.1', port: 8888 }, () => {
console.log("连接成功")
})
socket.setEncoding
socket.setEncoding
用于设置编码
socket.setEncoding([encoding])
参数说明:
- encoding 编码格式,默认为utf8
socket.write
socket.write
用于在 socket 上发送数据
socket.write(data[, encoding][,callback])
参数说明:
- data 待发送数据
- encoding 编码格式,默认为utf8
- callback 回调函数
socket.end
socket.end
用于半关闭socket
socket.end([data[, encoding]])
参数说明:
- data 待发送数据
- encoding 编码格式,默认为utf8
socket.destory
socket.destory
用于销毁套接字。
socket.destory()
注意:
确保套接字没有I/O操作时去调用
socket.pause
socket.pause
用于暂停读取数据。即不会再出发data事件
socket.pause()
socket.resume
socket.resume
用于恢复读取数据
socket.resume
socket.timeout
socket.timeout
用于设置 socket 闲置超时时间
socket.timeout(timeout[, callback])
参数说明:
- timeout 超时时间,单位毫秒
- callback 回调函数
socket.setKeepAlive
socket.setKeepAlive
用于设置是否使用长链接
socket.setKeepAlive([enable][, initialDelay])
参数说明:
- enable 禁用标记。默认值为false
- initialDelay 设置接受到最后一个数据包到第一个 keepalive 探测间的延迟,单位毫秒。默认值为0
socket.address
socket.address
用于获取绑定的IP信息。返回一个对象,该对象包含三个属性:port (端口号)、family (协议族,是 IPv6 还是IPv4 )、address(IP地址)
扩展
net.connect
net.connect
用于创建 socket 连接。net.createConnection的别名
net.connect(opionts[, connectListener])
参数说明:
- options 参数配置
- port 端口
- host 主机地址。默认值为localhost
- localAddress 本地地址
- localPort 本地端口
- family IP栈版本。必须为4 、6 或0 。0 表示允许使用IPv4 和IPv6 。默认值为0
- keepAlive 是否保持活动。默认为false
- connectListener 连接事件
net.connect(path[, connectListener]) // 用于创建 IPC 连接
参数说明:
- path 连接路径
- connectListener 连接事件
net.connect(port[, host[, connectListener]]) // 用于创建 TCP 连接
参数说明:
- options 参数配置
- port 端口
- host 主机地址。默认值为localhost
- connectListener 连接事件
net.createconnection
net.createconnection
用于创建 socket 连接
net.createconnection(opionts[, connectListener])
参数说明:
- options 参数配置
- port 端口
- host 主机地址。默认值为localhost
- localAddress 本地地址
- localPort 本地端口
- family IP栈版本。必须为4 、6 或0 。0 表示允许使用IPv4 和IPv6 。默认值为0
- keepAlive 是否保持活动。默认为false
- connectListener 连接事件
net.createconnection(path[, connectListener]) // 用于创建 IPC 连接
参数说明:
- path 连接路径
- connectListener 连接事件
net.createconnection(port[, host[, connectListener]]) // 用于创建 TCP 连接
参数说明:
- options 参数配置
- port 端口
- host 主机地址。默认值为localhost
- connectListener 连接事件
net.createServer
net.createServer
用于创建新的 TCP 或 IPC 服务器。
net.createServer([options][, connectionListener])
参数说明:
- options 参数配置
- allowHalfOpen 是否允许一个半开的TCP连接。默认值为false
- highWaterMark
- pauseOnConnect 是否在一旦来了连接就暂停套接字。默认值为false
- noDelay 是否在收到新的传入连接时立即禁用 Nagle 算法 。默认值为false
- keepAlive 是否在接受到新的传入连接立即在套接字上启用保持活动功能。默认值为false
- keepAliveInitialDelay
- connectionListener 事件监听器
服务端
javascript
const net = require('net')
// 创建 net.Server 实例
const server = net.createServer((socket) => {
/********************** net.socket 事件***************************/
// 成功建立连接时触发
socket.on('connect', () => {
console.log("成功与客户端建立链接")
})
// 接受到数据触发事件
socket.on('data', (data) => {
console.log("接收到socket数据:" + data.toString())
})
// 写缓冲区变为空时触发事件
socket.on('drain', () => {
console.log("写缓冲区刷新了")
})
// 当套接字的另一端数据传输结束时触发事件
socket.on('end', () => {
console.log("数据接受完毕")
})
// 发生异常时触发事件
socket.on('error', (err) => {
console.error("发生异常:" + err.message)
})
// 连接关闭时触发事件,回调函数中 hasError 表示套接字是否传输错误而关闭
socket.on('close', (hasError) => {
//
console.log("连接关闭")
})
})
/********************** net.Server 属性***************************/
// 设置最大连接数
server.maxConnections = 3
/********************** net.Server 事件***************************/
// 服务器建立新链接时触发事件
server.on('connection', () => {
console.log("建立连接")
})
// 服务器发生错误时触发事件
server.on('error', (err) => {
console.error("发生了错误")
})
// 服务器关闭时触发事件
server.on('close', () => {
console.log("服务器关闭了")
})
/********************** net.Server 方法***************************/
// 设置监听
server.listen(8888, () => {
console.log("Server is staring ...")
})
// 异步获取服务器的最大并发连接数
server.getConnections((err, count) => {
if (err) {
console.error("获取服务器最大并发连接数出现异常:" + err.message)
}
console.log("服务器最大并发连接数:" + count)
})
// 停止服务器
server.close((err) => {
console.log("关闭服务器")
})
客户端
javascript
const net = require('net')
// 创建 net.Socket 实例
const socket = new net.Socket()
// 建立 socket 连接
const client = socket.connect({ host: '127.0.0.1', port: 8888 }, () => {
console.log("连接成功")
})
/********************** net.Socket 属性***************************/
// 接受字节数
client.bytesRead = 1024
// 发送字节数
client.bytesWritten = 512
// 远程 IP地址 信息
client.remoteAddress
// 远程 IP 协议族
client.remoteFamily
// 远程 端口
client.remotePort
// 本地 IP地址 信息
client.localAddress
// 本地 IP 协议族
client.localFamily
// 本地 端口
client.localPort
/********************** net.Socket 事件***************************/
// 连接server时触发事件
client.on('connect', () => {
console.log("成功连接到服务")
})
// 套接字准备好时触发事件
client.on('ready', () => {
console.log("socket 已准备好")
})
// 接受到数据时触发事件
client.on('data', (data) => {
console.log("接收到server发送的数据:" + data)
})
// 当套接字的另一外数据传输结束时触事件
client.on('end', () => {
console.log("对方已发送")
})
// 写缓冲区中变空时触发事件
client.on('drain', () => {
console.log("写缓冲区已置空")
})
// socket 空闲超时时触发
client.on('timeout', () => {
console.log("套接字空闲超时")
})
// 发生错误时触发事件
client.on('error', (err) => {
console.log("发生了错误:" + err.message)
})
// 关闭时触发
client.on('close', () => {
console.log("关闭连接")
})
/********************** net.Socket 方法***************************/
// 发起连接
client.connect()
获取连接地址信息
const address = client.address()
console.log("连接地址信息:" + address)
// 暂停读取
client.pause()
// 恢复读取
client.resume()
// 设置编码
client.setEncoding("utf8")
// 设置套接字空闲超时时间
client.setTimeout(1000000)
// 发送数据
const data = "天生我材必有用,千金散尽还复来"
client.write(data, (err) => {
if (err) {
return console.error("发送数据失败:" + err.message)
}
console.log("成功发送数据:" + data)
})
// 销毁
client.destroy()