NodeJS net 网络模块
net 模块是 node 对 TCP 或者 IPC 开发的封装,包括了客户端和服务器端相关 API。对于阅读本文,请您有一定的网络编程的基础。 您需要已经了解了:
- ip 协议,会配置 ip 地址
- 了解 dns 解析过程,了解 dns 的概念
- 了解基本的 TCP 的协议的
- 了解 Socket 的编程相关概念
- 了解 node 的事件处理、流、文件处理等
- 了解 HTTP 协议
本文,仅对部分 API 和 TCP 开发做一些简单介绍。
创建 TCP 服务器端
net.Server
类用于创建 TCP 的 server,而且继承了 EventEmitter
。通过 net.createServer([options][, connectionListener])
方法创建此类型实例。
const net = require('net');
// 创建服务器端的
const server = net.createServer();
// 监听异常错误事件
server.on('error', err => {
// throw err;
console.log(err);
});
// 监听客户端的连接事件,客户端连接上后,会自动执行回调函数,回调函数的参数就是指向客户端的 socket
server.on('connection', clientSocket => {
console.log('客户端:%s', clientSocket.remoteAddress);
// 监听此客户端的 end 事件。
clientSocket.on('end', () => {
console.log('client disconnected');
});
// 监听此客户端发送数据的事件。
clientSocket.on('data', data => {
console.log('收到数据:%s', data);
});
// 向客户端发送数据
clientSocket.write('Hi, aicoder.com ');
// 2s 后让客户端退出
setTimeout(() => {
// 通知客户端退出,并发送数据。
clientSocket.end('bye!');
}, 2000);
});
// 服务器开始监听 60003 端口(端口:0-65535 之间的一个值)
server.listen(60003, () => {
console.log('opened server on', server.address());
});
// 以下为关闭监听的实例
// setTimeout(() => {
// console.log('服务器端退出!!!');
// server.close();
// }, 5000);
net.Server
是对服务器端的 Socket 的封装,可以监听 close
事件、 error
事件、 connection
事件、 listening
事件。还可以通过 close()
方法关闭服务的监听。其他用法参考 官网文档 。
net.Socket
类是对客户端 Socket 的封装,可以监听 close
事件、 connect
事件 、 data
事件、 drain
事件、 end
事件、 error
事件 、lookup
事件、 timeout
事件。可用的方法包括: write()
发送数据、 edn()
结束连接等。其中可以同 data
事件来处理服务器端的数据。
创建 TCP 的客户端
net.createConnection()
方法可以实现连接服务器端,并生成一个 net.Socket
类实例,跟服务器端进行交互就是靠此实例。
const net = require('net');
// 创建连接到服务器的客户端
let client = net.createConnection('60003', '127.0.0.1', () => {
client.write('Hi, client, for aicoder.com');
console.log('连接上服务器端!');
});
client.on('error', err => {
console.log(err);
});
client.on('end', () => {
console.log('结束连接!');
});
client.on('close', () => {
console.log('退出');
});
client.on('data', data => {
console.log('收到数据: %s', data);
});
通过 Socket 上传文件的例子
const net = require('net');
const path = require('path');
const fs = require('fs');
// 创建服务器端的
const server = net.createServer();
// 监听异常错误事件
server.on('error', err => {
console.log(err);
});
// 监听客户端的连接事件,客户端连接上后,会自动执行回调函数,回调函数的参数就是指向客户端的 socket
server.on('connection', clientSocket => {
console.log('客户端:%s', clientSocket.remoteAddress);
// 监听此客户端的 end 事件。
clientSocket.on('end', () => {
console.log('client disconnected');
});
// 监听此客户端发送数据的事件。
clientSocket.on('data', data => {
console.log('收到数据:%s', data);
let fileName = path.join(__dirname, 'b.html');
let ws = fs.createWriteStream(fileName);
ws.write(data, 'utf8');
});
// 向客户端发送数据
clientSocket.write('Hi, aicoder.com ');
});
// 服务器开始监听 60003 端口(端口:0-65535 之间的一个值)
server.listen(60003, () => {
console.log('opened server on', server.address());
});
// 以下是客户端代码
const client = net.createConnection(60003, '127.0.0.1', () => {
console.log('连接上服务器端!');
let fileName = path.join(__dirname, 'a.html');
let rs = fs.createReadStream(fileName, { encoding: 'utf8' });
// socket 本身是可读可写流,所以可以直接用管道。
rs.pipe(client);
});
模拟一个 WEB 服务器软件
如果您已经了解了 HTTP 协议的话,而且已经掌握如何做 TCP 的发送数据和接受处理数据,再有您稍微掌握一点字符串处理的技巧,那么您就很容易做一个简单的静态 web 服务器出啦。当然这里是说用底层的 API,不是用 http 模块。
限于篇幅,在此不再赘述,请直接看我的 github 源码 ,仅仅是 demo,不要用于生产环境中。
总结
node 中对 socket 的封装,还是比较像 node 的开发风格的,可能跟其他平台的 socket 编程的风格不一致,但是原理和开发方式都是一样的。这里仅仅是简单介绍一下 Node 下面网络编程的基本方法,细节请参考官网文档。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Node 的事件处理
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论