NodeJS net 网络模块

发布于 2024-08-20 06:18:47 字数 4368 浏览 13 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

独孤求败

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文