逻辑: 首先把routerUrl目录下的函数初始化缓存起来,通过Router.request调用缓存起来的函数,这个函数实际上是register.set方法,主要是开始运行函数链,通过register.next 运行下一个函数。
函数流 main.js --> Router.request --> register.set --> register.next --> sock.write
main.js
'use strict';
const routerUrl = 'router'; // 当前目录下的router地址
const Router = require('./net/Router'); // 初始化路由
const net = require('net');
const port = '3000';
Router.init(routerUrl);
const app = sock => {
sock.on('data', function (data) {
try {
Router.request(data, sock);
} catch (error) {
console.log(error)
}
});
sock.on('error', (err) => {
console.log(err)
})
// 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function (data) {
console.log('clone')
})
}
const server = net.createServer(app);
server.listen(port, () => {
console.log(`Startu in env ${process.env.NODE_ENV || 'development'} on port ${port}`);
});
server.on('error', (err) => {
console.log(err)
})
路由加载:
Router.js文件
const fs = require('fs');
const _ = require('lodash');
var path = require("path");
var ROOT_PATH = path.resolve(__dirname);
class Router {
constructor() {
this.routeMap = {};
}
/**
* 通过routerUrl来匹配目录下的文件,加载进来
* @param {*} routerUrl
*/
init(routerUrl) {
let files = fs.readdirSync(path.join(ROOT_PATH, `../${routerUrl}`));
return _.reduce(files, (config, file) => {
let svc = require(path.join(ROOT_PATH, `../${routerUrl}/${file}`));
this.routeMap = {
[file.split('.')[0]]: svc.get()
};
}, {})
}
/**
* 通过url匹配加载的router, 其他字段可自定义,url这里的逻辑也可改成配置文件进行配置,类似于protobuf
* @param {*} data {url, body}
* @param {*} sock
*/
request(data, sock) {
try {
this.routeMap[result.url.split('/')[1]][result.url.replace(`/${result.url.split('/')[1]}`, '')](data, sock);
} catch (error) {
sock.write(error);
}
}
}
module.exports = new Router();
中间件:
register.js文件
const Next = require('./next');
class Register {
constructor() {
this._init = {};
}
<!-- 初始化router函数,开始运行函数链 -->
set(url, ...handlers) {
this._init[url] = async (data, sock) => {
try {
let next = new Next(handlers);
next.run(data, sock);
} catch (error) {
sock.write(error);
}
};
}
<!-- 获取初始化的router函数 -->
get() {
return this._init;
}
}
module.exports = new Register();
nest.js文件
class Next {
constructor(stack) {
this.index = 0;
this.stack = stack;
this.data = null;
this.sock = null;
}
<!-- 运行中间件 -->
run(data, sock) {
this.data = data;
this.sock = sock;
this.stack[this.index](data, sock, this.next.bind(this));
}
<!-- 调到下一个中间件,若带参数就跳到第arguments[0]步 -->
next() {
if (arguments[0] && arguments[0] === +arguments[0] && +arguments[0] < this.stack.length) {
this.index = +arguments[0];
return this.run(data, this.sock);
}
this.index++;
this.run(this.data, this.sock);
}
}
module.exports = Next;
注册文件
const init = require('../net/register');
init.set('/test',
(data, sock, next) => {
next()
},
async (data, sock) => {
try {
sock.write(test);
} catch (e) {
sock.write(e);
}
});
总结:这个项目只是用来歇息express的思想,要用在实际开发中还需要断线重连,优化连接,异常处理等功能。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“详解一个基于套接字实现长连接的express”评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
2025年11月06日
2025年11月06日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]