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()
相关推荐
m0_535817559 小时前
macOS下Claude Code从0到1配置教程(附API密钥获取+常见报错修复)
gpt·macos·node.js·api·claude·claudecode·88api
用户3570850288113 小时前
我做了一个自动生成项目入门文档的 CLI 工具
node.js
云水一下16 小时前
模块系统与 npm——万物皆模块
前端·npm·node.js
wgc2k18 小时前
Node.js游戏服务器项目移植 4-MongoDB的移植
mongodb·游戏·node.js
meilindehuzi_a19 小时前
Node.js × 大模型:AIGC 工程化基础与异步流控总结
node.js·aigc
不好听6131 天前
Node.js 工程化开发流程 — 知识点总结
javascript·node.js
HjhIron2 天前
🚀 从零开始,用 Node.js 构建你的第一个 AIGC 项目
node.js·aigc
To_OC2 天前
我调用 DeepSeek API 连踩 3 个坑,终于把 Node AIGC 开发的核心知识点捋顺了
后端·node.js·aigc
sugar__salt2 天前
从零落地 Generative AI 接口调用:Node.js 工程化最佳实践
人工智能·node.js