目录
- 0. 写在前面
- 1. 背景映入
- 2. 数据库选择
- 3. Nodejs TCP连接
- 3. 代码编写
- 4. 实验
- 5. wireshark 抓包分析
- 6. 杂与代码
大家如果有去看过nodejs所支持的官方库的话,应该会惊讶于它所提供了非常完善的网络库,不仅是应用层,传输层,等等基础的协议,我们可以按照事件驱动的逻辑编写清晰易懂的网络应用,网络服务 。这也是本文为什么选择Nodejs编写的原因 。1. 背景映入大家在使用一些数据库软件的时候常常会使用远程连接
mysql -h xxx.xxx.xxx.xx -u xzzz -p
这里也指明了ip地址,但是很明显这里可不是http协议在服务,而是更加底层的协议 - 传输层协议,具体来说是TCP协议(Transmission Control Protocol) 。通信的示意图如下:文章插图
所以很自然的想到,数据库的客户端一定经过如下流程,从而与远程相连接:
graph TB 身份验证 --> 运输层连接建立 运输层连接建立 --> 客户端服务端输入输出绑定_通道 客户端服务端输入输出绑定_通道 --> 连接中断 连接中断 --> 双方退出释放资源所以我们可以尝试向服务端发送这样的请求消息,建立与服务端的连接,发送一些数据,接受一些数据,最后断开连接 。
2. 数据库选择【用Nodejs 实现一个简单的 Redis客户端】这里为了简单起见,我们考虑不需要身份验证的redis数据库来作为此次实验的服务端 。如果大家是mac,或者linux倒是可以直接安装,如果是windows的话,推荐使用docker进行安装,这里给出一行docker命令 。
docker run--name redis-server -p 6379:6379 -d redis:latest
3. Nodejs TCP连接在nodejs中支持TCP连接的是net模块, 其中使用createConnection(config)
或者直接new Socket(config)
来初始化一个TCP连接 。上面两个函数不论哪一个都会返回socket实例,如果连接正常的话,就可以通过这个socket发送消息了 。文章插图
文章插图
当服务端redis接收到消息之后也会返回相应的消息,在本机客户端通过对数据的校验,检查后,触发相应的操作(是拒绝还是接受服务端的响应) 。
3. 代码编写知道了原理之后,我这里直接把代码贴出来
- RedisSocket: 继承自Socket
class RedisSocket extends Socket {constructor(config: RedisClientConfig) {super();this.connect(config.port, config.host);} // Setpublic set(key: string, value: string | number): Promise<Buffer> {return new Promise((resolve, reject) => {this.write(`SET ${key} ${value}\n`);const fetchAns = (chunk: Buffer) => {if (chunk.toString().includes("OK")) {resolve(chunk);this.off("data", fetchAns);// 在交付完成之后使用off 把函数取消绑定} else {reject("error! can't set data");}}this.on("data", fetchAns);})} // Getpublic get(key: string): Promise<Buffer> {return new Promise((resolve, reject) => {try {this.write(`GET ${key}\n`);const fetchAns = (chunk: Buffer) => {resolve(chunk);this.off("data", fetchAns);// 在交付完成之后使用off 把函数取消绑定}this.on("data", fetchAns);} catch(err) {reject(err);}})} // 断开TCPpublic close() {this.end();}}
这个类将用来处理建立好后的连接的
- RedisClient
class RedisClient {private config: RedisClientConfig;constructor(config: RedisClientConfig) {this.config = config; // 配置项} // 获取redis实例getConnection(): Promise<RedisSocket> {return new Promise((resolve, reject) => {const socket = new RedisSocket(this.config);socket.on("connect", () => {resolve(socket);});socket.on("error", (err) => {reject(err);});});}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现
- 百雀羚的修饰乳用法是什么?
- 眉粉适合当修容使用吗?
- 明日之后怎么用电脑玩(明日之后如何在电脑玩)
- Docker基础和常用命令
- 【深入浅出 Yarn 架构与实现】1-1 设计理念与基本架构
- 怎么用一句话暗示小人 怎样发朋友圈警告小人
- 感谢领导良苦用心 感谢领导的话简单朴实
- 华为mate40手机怎么截屏_华为mate40截图功能怎么使用
- 黑莓q5用安装微信的方法a 用黑莓自带的印象笔记手敲的 看不懂的宝宝们在私聊我吧