Node.js教程-net模块

net模块是Node.js官方提供的用于底层网络通信的模块,包含了创建服务器/客户端的方法。
net模块主要包含了两部分:

  1. net.Server 用于创建 TCP 服务,内部通过 socket 来实现与客户端的通信
  2. 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 事件
注意:

  1. 正常关闭时,callback会被执行,同时会触发 close事件;
  2. 异常关闭时,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栈版本。必须为4600 表示允许使用IPv4IPv6 。默认值为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栈版本。必须为4600 表示允许使用IPv4IPv6 。默认值为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栈版本。必须为4600 表示允许使用IPv4IPv6 。默认值为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()
相关推荐
ldq_sd5 小时前
node.js安装和配置教程
node.js
我真的很困6 小时前
坤坤带你学浏览器缓存
前端·http·node.js
whyfail9 小时前
ESM 与 CommonJS:JavaScript 模块化的两大主流方式
javascript·node.js
熊的猫9 小时前
ES6 中 Map 和 Set
前端·javascript·vue.js·chrome·webpack·node.js·es6
Pigwantofly11 小时前
软件工程概论项目(二),node.js的配置,npm的使用与vue的安装
node.js
ZJ_.14 小时前
Electron 沙盒模式与预加载脚本:保障桌面应用安全的关键机制
开发语言·前端·javascript·vue.js·安全·electron·node.js
前端SkyRain15 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
丁总学Java15 小时前
使用 npm 安装 Yarn
前端·npm·node.js
理想不理想v15 小时前
执行npm run build -- --report后,生产report.html文件是什么?
java·前端·javascript·vue.js·webpack·node.js
ForRunner12317 小时前
在 Node.js 中解决极验验证码:使用 Puppeteer 自动化
运维·node.js·自动化