net
模块是Node.js
官方提供的用于底层网络通信的模块,包含了创建服务器/客户端的方法。
net
模块主要包含了两部分:
net.Server
用于创建 TCP 服务,内部通过 socket 来实现与客户端的通信net.Socket
是 TCP或Socket的抽象,实现了一个全双工流接口net.Server
用于创建 TCP 或本地服务器
net.server([options][, connectionListener])
参数说明:
close
事件 server 关闭时会被触发。仅到所有连接到结束时才会触发该事件connection
新连接建立时会被触发error
当错误出现时会被触发listening
当服务被绑定后调用 server.listen() 时被触发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()
用于获取服务器监听的地址。此方法返回一个JSON对象,该对象有三个属性:port (TCP服务器监听的端口号)、family (TCP服务监听的地址是 IPv6还是IPv4)、address(TCP监听的地址)
server.address()
server.close
用于服务器停止接受新链接并保持现有链接。当所有连接结束时服务器会关闭,并触发close事件
注意:
server.close([callback])
参数说明:
server.getConnetions
用于异步获取服务器当前活跃连接的数量
server.getConnetions(callback)
参数说明:
server.listen
用于配置监听
server.listen(handle[, backlog][, callback])
参数说明:
server.listen(options[, callback])
参数说明:
server.listen(path[, backlog][, callback])
参数说明:
server.listen([port[, host[, backlog]]][, callback])
参数说明:
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([options])
参数说明:
服务端Socket
const net = require('net')
// 创建 net.Server 实例
const server = net.createServer((socket) => {
console.log("服务端侧的Socket >>> " + socket)
})
// 设置监听
server.listen(8888, () => {
console.log("服务器启动成功")
})
客户端Socket
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连接。
socket.connect(options[, connectListener])
参数说明:
socket.connect(path[, connectListener]) // 用于 IPC 连接
参数说明:
socket.connect(port[, host[, connectListener]]) // 用于 TCP 连接
参数说明:
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([encoding])
参数说明:
socket.write
用于在 socket 上发送数据
socket.write(data[, encoding][,callback])
参数说明:
socket.end
用于半关闭socket
socket.end([data[, encoding]])
参数说明:
socket.destory
用于销毁套接字。
socket.destory()
注意:
确保套接字没有I/O操作时去调用
socket.pause
用于暂停读取数据。即不会再出发data事件
socket.pause()
socket.resume
用于恢复读取数据
socket.resume
socket.timeout
用于设置 socket 闲置超时时间
socket.timeout(timeout[, callback])
参数说明:
socket.setKeepAlive
用于设置是否使用长链接
socket.setKeepAlive([enable][, initialDelay])
参数说明:
socket.address
用于获取绑定的IP信息。返回一个对象,该对象包含三个属性:port (端口号)、family (协议族,是 IPv6还是IPv4)、address(IP地址)
net.connect
用于创建 socket 连接。net.createConnection的别名
net.connect(opionts[, connectListener])
参数说明:
net.connect(path[, connectListener]) // 用于创建 IPC 连接
参数说明:
net.connect(port[, host[, connectListener]]) // 用于创建 TCP 连接
参数说明:
net.createconnection
用于创建 socket 连接
net.createconnection(opionts[, connectListener])
参数说明:
net.createconnection(path[, connectListener]) // 用于创建 IPC 连接
参数说明:
net.createconnection(port[, host[, connectListener]]) // 用于创建 TCP 连接
参数说明:
net.createServer
用于创建新的 TCP 或 IPC 服务器。
net.createServer([options][, connectionListener])
参数说明:
服务端
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("关闭服务器")
})
客户端
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()