基于Zinx框架实现轻量级TCP服务器

2023-11-19

一、框架部分

 包括一个sever,两个读、写模块、一个API管理,一个消息队列管理,一个读写池

 建目录一个抽样层,一个实体层

二、基于zinx服务器的应用

对于一个框架,越简单来说越好

V0.1:简单的服务器客户端

1、对于开始:完成简单的服务器搭建

获取addr(net.……addr(版本号,地址))、监听地址、阻塞等待客户端连接/

2、对于start来说:可能会在listen出阻塞,为了避免用一个go来承载

用户启动的时候用serve来启动,尽量避免把start和stop等接口暴露给用户

将 start和serve分离:start只进行监听和处理功能,serve进行阻塞

3、实验Client: 为了看得更清晰使沉睡一秒:time.sleep(1 time.Second)

//建立连接:net.Dail → 读/写,用一个buf接受服务端读写的数据并进行显示

V0.2:简单的连接封装和业务绑定

 1、

	// GetTCPConnection 获取当前链接所绑定的socket conn
	GetTCPConnection() *net.TCPConn

 此处的 *net.TCPConn为返回类型:

//定义一个处理链接业务的方法
type HandleFunc func(*net.TCPConn, []byte, int) error
//handlefunc表示绑定的方法,是一个函数类型,有三个形参,返回值是error的类型
//三个形参:既然是处理连接一定从对端客户端的连接句柄,从这里回写数据,处理的数据内容,处理的数据长度

绑定api连接句柄这里没太听明白

 3、连接和server集成:

三、基础路由模块:(v0.3版本智能完成一个路由模块)

1、request消息封装:将连接和数据绑定在一起,以request为一个单位请求包

router是针对request进行消息处理

 疑问:

为什么是*

 2、router模块:抽象

路由不需要方法,只是提供方法的接口,

对接口的实现应该是用户自定义而不是事先接好的,两种方法:

可以直接继承重写irouter,或者先嵌入baserouter作为基类,然后根据需求对基类方法进行重写

但是对方法不需要写死, 可以让人继承后自己重写

一个抽象的类想做一个实体类,需要把抽象层所有的方法都给实现,但实际开发中可能不需要全部,这样继承这个base后只要对需要的重写即可

3、router集成到zinx中

4、测试:

3、Vconnection路由处理请求的时候:

在定义方法的时候,pre函数里传递的是抽象的request指针,但是req为实例是request,所以

 用go func:不明白为什么用go,也不明白为什么三个都要写,这不乱了

四、v4.0:全局配置:对ip、端口号让用户可配:用json

 1、加载配置模块,建立一个配置信息

zinx.json是用户进行配置的,对于框架来说不应该存在

"Name" : " demo server" ,"Host" : "127.0.0.1"," TcpPort" :7777,
"MaxConn" : 3
创建全局参数文件→ 提供init初始化方法(读取、提取、填充)→ 硬参数替换与sever初始化参数的配置

初始化中,0.0.0.0 表示本地的全IP,127.1.1.1只适用于有回路网卡的IP,多个网卡不好用

//读取json数据并提取部分,

 用panic因为如果配置参数如果失败也没必要进行下去了

// 将之前硬代码进行替换

测试阶段:json里的属性名称要和global里的一致 

五、消息封装

1、解决粘包问题:用tlv的序列化消息

自定义的应用层协议:拆包序列化,把内容分成head和body,head中两部分一个序列号一个内容长度

Q1:为啥没有属性,封装以后不应该有个结构体吗

Q2:什么时候需要初始化方法(这里有,gloab也有)如何理解这俩地方

(2)创建一个空字节的方法(不固定)

 二进制写法:binary.Write

创建二进制阅读器:dataBuff := bytes.NewReader(binaryData)

定义输出新错误提醒的方法:errors.New("  ")

 (3)单元测试 Test (测试时要把reload关闭) :  func TestDataPack(t *testing.T)

io :读取容器

断言:

将interface换成指针用断言

Q1:第二次应该是接着后面的内容的继续读,readful不知道是续读还是重头读

Q2:客户端阻塞:select

2、将消息封装集成到zinx框架中

(1)修改request结构体,把data换成message

(2)在connection的read方法中,在处理业务时加入拆包解包过程

Q1:这里重复的用复制直接报错一大段

(3)提供封包方法(不能单纯的再给客户端写信息,回写一个二进制流的封装包)

3、zinx0.5开发

Q1:

[]byte("ping...ping...ping")和[]byte{"ping...ping...ping"}的区别

Q2:切片转换

六、多路由:根据不同的Id进行不同的业务处理

消息管理模块:支持多路由业务api调度管理

 

七、读写分离

 

八、消息队列和多任务

reader和writer是阻塞状态不占用cpu

client请求数量和goroutine一样,尽量降低,越多则切换频率越高资源消耗越大

改成固定的数值,使用消息队列,则cpu调度只在go之前切换就可以了,在极大并发量时提升效率

 每个worker都是一个go,每个go都有一个管道,构造一个简单的轮询分配

 

 

九、管理连接的模块

1、创建连接管理模块

Q:定义一个锁

 

 写锁:

2、将连接管理模块集成到zinx中

为了完成将conn加入的manager中,对一系列属性进行增加,包括server和connection,现在脑子里一团屎都等明天顺一下

3、提供给zinx创建后、销毁连接前所要处理的业务,提供给用户能够注册的hook函数

 

 实现:给开发者提供接口,唯一的接口在server

  

Q: hook函数是什么: 注册和使用

4、0.9开发

十、连接属性配置:给客户的留白

 

 

 

 

问题:

1、调用不同项目下的包:(1调2)

则1的go.mod中用replace,require

go mod 导入不同项目内的本地包_不好意思海底捞月的博客-CSDN博客

拓:Go语言go mod包依赖管理工具使用详解 (biancheng.net)

2、fmt.sprintf可以用于拼接字符串

3、在v0.2的时候,希望出现callbacktotcp

却遇到服务端报错 :

read err: read tcp4 127.0.0.1:8999->127.0.0.1:29816: wsarecv: An existing connection was forcibly closed by the remote host.
解决:http://www.suoniao.com/topic/5ffea5abce957766a2555040

 把这一部分改掉了就成了正常的,这里不太懂???

4、v0.4在全局配置信息后,服务器名称和改的过来但是IP和名称没有修改:

 且客户端报错:go: no packages loaded from .\Client.

5、v0.6: 运行报错两个信息:

read json error:, open conf/zinx.json: The system cannot find the path specified.

fatal error: all goroutines are asleep - deadlock!

改了改json没报错了,但是第二个还在,发现是客户端在listen监听的时候出现问题报错nil,

两个小时,两个小时!!!!!!我知道了因为之前有运行的进程没关闭占用端口了,刚开始不太理解这个报错信息,通过比对网上另一位同学的代码运行了他的报错是下面的,虽然不知道为啥报错信息不一样。杀掉进程就好了具体参考下面这个哥的

他的报错:

Only one usage of each socket address (protocol/network address/port) is normally permitted.

listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is nor_匿名用户123的博客-CSDN博客

6、delete函数(map,key)

7、v10:Q    panic: assignment to entry in nil map

没有对map进行初始化,只进行了定义并没有用指针开辟空间,则在connection中需要开辟内存空间

优化:1、日志模块:对日志进行存留

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Zinx框架实现轻量级TCP服务器 的相关文章

  • 在阿里云ECS云服务器上部署和使用开源的应用程序容器引擎Docker

    Docker 是一个开源的应用程序容器引擎 具有可移植性 可扩展性 高安全性和可管理性等优势 它允许开发人员将应用程序和依赖项打包到可移植容器中 从而在 Linux 机器上高效构建 部署和管理应用程序 阿里云提供Docker镜像仓库 用于快
  • 虚拟主机操作系统 Windows、Linux

    操作系统将直接影响服务器的性能 安全性和可用性 因此确保选择合适的操作系统对于成功运行您的网站或应用程序至关重要 以下是一些考虑因素 可帮助您选择适合您需求的虚拟主机操作系统 1 熟悉度和技术支持 如何选择操作系统应该考虑您的经验水平和熟悉
  • 【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

    文章目录 1 备份 SD TF 卡为镜像文件 2 压缩镜像文件 2 1 多分区镜像文件的压缩 树莓派 普通 linux 系统等 2 2 单分区镜像文件的压缩 Nvidia Jetson Nano 等 3 还原镜像文件到 SD TF 卡
  • Project Euler - #1 Python 错误解决方案

    总体而言 我对编码还比较陌生 因此启动了欧拉项目 以使我的编码更进一步 花了一些时间思考如何自己解决第一个问题并尝试使用递归函数 不幸的是总是遇到同样的错误 266333 我错过了什么 有什么重大错误值得学习吗 原问题是 如果我们列出所有
  • 如何始终运行 Spyder 项目中的主文件

    我正在开发一个包含多个文件的Python项目 令人烦恼的是我必须在单击运行之前选择描述和调用main的文件 因为如果不是Spyder3 Anaconda 则运行当前选定的文件 如果打开并选择文件 如何从 mainPrjPy py 中的 ma
  • 如何在 C# 中引用另一个项目?

    我在我的解决方案中添加了一个项目 Project2 它已经有另一个项目 比如说项目 1 我如何将项目 2 中的类和方法调用到项目 1 中 我做了什么 我有项目 1 及其解决方案 我将项目 2 添加到项目 1 的解决方案中 项目 1 和项目
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制_raylink todesk

    目录 一 前言 二 远程控制中的安全威胁 三 国内外远控软件安全机制 ToDesk RayLink Teamviewer Splashtop 四 安全远控预防 一 前言 近期 远程控制话题再一次引起关注 据相关新闻报道 不少不法分子利用远程
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • Android Studio - 自动项目加载

    我找不到一种方法来阻止 Android Studio 自动加载最后使用的项目 我希望它打开开始窗口 其中包含可用项目列表 而不是自动加载上次使用的项目 的位置Reopen last project on startup被移至Settings
  • 由于其保护级别而无法访问该类[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个项目 IBSampleApp 在两个解决方案中使用 并且它的类在两个解决方案中都遇到以下编译器错误 由于其保护级
  • Android Studio:默认项目目录

    每当我创建一个新项目时Android Studio它希望将其放在类似于以下位置的通用默认文件夹中 取决于操作系统 Ubuntu home USER AndroidStudioProjects 我想将此目录更改为另一个位置 除了在创建每个项目
  • Visual Studio 2008 中 BizTalk 架构项目的引用问题

    在大型 VS 2008 解决方案中 我们有不同的架构项目和映射项目 映射项目引用了适当的模式项目 总体来说效果很好 但是 最近我添加了一个新的架构项目 它始终如一地给出了同样的问题 当我向其中添加新架构 并且想要在已引用该架构项目的映射项目
  • Visual Studio 解决方案不可用(重新加载不起作用)

    我正在下载我正在使用的条形码阅读器的示例程序 每次我下载该程序并运行它时 我的解决方案资源管理器中都会提示错误 见下图 有什么建议么 每次我右键单击并重新加载项目时 它都会快速重新加载 然后恢复为不可用 建议 编辑 这是该项目的链接 滚动到
  • 如何在 sbt 中为我的项目设置系统属性?

    我确信我错过了一些非常简单的东西 我想设置系统属性java awt headless to true对于我的 sbt 项目 正在阅读属性页面 http code google com p simple build tool wiki Pro
  • CodeLite 工作区是否应该共享?

    我正在开发一个项目 其中几个人通过 Git 处理相同的代码 我只是想知道从事该项目的每个人是否都应该共享相同的工作区 通过 foo workspace文件 或者只是共享项目 通过 foo foo project file You can 确
  • 使用 VS2010 Professional 从 TFS 在线删除项目(TFSDeleteProject 不在我的计算机上!)

    我有 Visual Studio 2010 Professional 并且一直在 Visualstudio com 上使用 TFS 服务 我读了这个问题及其答案 https stackoverflow com questions 13635
  • 具有多个项目的工作空间还是一个具有多个目标的项目?

    我有 4 个 iOS 应用程序 它们都很相似 它们是闪存卡应用程序 每个应用程序都有不同的主题 他们共享很多课程和图像 现在我将所有 4 个项目作为单独的项目 但我希望简化维护并共享资源 将所有 4 个项目放在同一个工作区中更好 还是将 4

随机推荐

  • AI芯片,是噱头还是趋势?

    随着AlphaGo的诞生 深度学习 日益普及 人工智能开始从智能化工具向智能机器进军 原有的MCU已无法满足深度学习的高速海量数据运算要求 AI芯片便应运而生 如今嵌入式芯片领域正面临AI芯片的新一轮机遇 那么在AI成为风口的当下 AI芯片
  • 2022年高级性能测试岗面试题【面试必看】

    昨天一个前同事找我 问有没有性能测试岗位的面试题 正好之前帮业务团队加面过几次性能测试岗位的候选人 我将面试时候会问的一些问题以及要考察的点列了出来 供大家参考 一 介绍下最近做过的项目 背景 预期指标 系统架构 场景设计及遇到的性能问题
  • oobabooga-text-generation-webui可能是最好的语言模型启动器(包含手把手安装教程)

    原文 oobabooga text generation webui可能是最好的语言模型启动器 包含手把手安装教程 哔哩哔哩 引言 问 oobabooga是什么 oobabooga text generation webui是一个用于运行类
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • 3.3 C++多继承与虚基类

    书接上回 继承存在二义性 上图中 A是虚基类 virtual的继承方式就是虚继承 参考下文章 C 虚继承和虚基类详解 知乎 zhihu com
  • apache和iis文件解析漏洞原理及修复

    Apache文件解析漏洞是指攻击者可以利用Apache服务器的文件解析功能 通过构造特殊的URL 访问服务器上的敏感文件 从而获取服务器上的敏感信息 IIS文件解析漏洞是指攻击者可以利用IIS服务器的文件解析功能 通过构造特殊的URL 访问
  • 面试官:如何用a标签实现文件下载?(一文带你手撕知识点)

    前言 大家好 今天给大家带来前端小知识 前端利用a标签实现文件 图片 下载 也就是教大家利用a标签或者是 window open 来实现下载功能 文章目录 前言 常用方式 方法分析 代码实现 常用方式 a href url 下载 a a标签
  • Weex简介及环境搭建(mac版)

    1 Weex简介及特点 weex 是一个使用 Web 开发体验来开发高性能原生应用的框架 在Ios和Android上都实现了一个渲染引擎 并提供了一套基础的内置组件 渲染出来的都是原生组件 提供了一套基础的内置模块 可以通过这些模块来调用一
  • 校园网服务器系统需求分析,校园网建设需求分析.doc

    校园网建设需求分析校园网建设需求分析 文档日期2012 5 9编号002项目名称北京市信息职业技术学院东校区校园网建设项目部门网建部开始时间2012 5 9结束时间2012 5 文档名称北京市信息职业技术学院东校区校园网建设项目需求分析文
  • 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结

    51CTO com原创稿件 Spring Cloud 在国内中小型公司能用起来吗 从 2016 年初一直到现在 我们在这条路上已经走了一年多 在使用 Spring Cloud 之前 我们对微服务实践是没有太多的体会和经验的 从最初的开源软件
  • uniapp git忽略unpackage文件

    最近在写整理一个app框架 遇到git提交时unpackage文件无法忽略的问题 1 第一反应是创建 gitignore文件 并写入unpackage目录 本以为大功告成 奈何还是不行 思考 可能是由于该文件已经被提交过 处于被跟踪状态 所
  • opencv安装教程python3.8_Python3.8 安装 OpenCV 库

    我是 Python 小新 本文演示如何在 Windows 10 下为 Python 安装 OpenCV 库 事实上 借助于强大的包管理工具 pip 只需要一条安装命令就可搞定 打开命令提示符 输入如下命令 pip install openc
  • Openframework在VS2010中的配置

    Openframework在VS2010中的配置 首先去官网下载Openframework 下载后最好解压到C盘根目录下 不然会出现各种问题 我也不知道怎么解决 随便打开其中的例程 然后右击该工程 选择属性 如下图 接着在C C 常规选项里
  • 基于MATLAB的WSN网络时间同步仿真

    目录 1 算法概述 2 仿真效果 3 matlab仿真源码 1 算法概述 WSN时间同步 时钟偏移与同步问题 主讲教师 马小林 1 时钟偏移与同步问题 1 时钟偏移与同步问题 时钟偏移 时钟之间的时间差 Clock Offset WSN系统
  • 【王道·计算机网络】第一章 计算机网络基本体系

    一 计算机网络概述 1 概念 计算机网络是一个将分散的 具有独立功能的计算机系统 通过通信设备与线路连接起来 由功能完善的软件实现资源共享和信息传递的系统 简而言之 计算机网络就是一些互联的 通过通信链路互联互通 自治的计算机系统的集合 2
  • pycharm:Updating Indices 解决办法

    pycharm Updating Indices 解决办法 右下角一直在update 然后我的文件夹里面文件很多 都是图片流 pycharm相当于预加载这些 然后在左侧可以查看 但是这个过程比较慢 解决的方法是让pycharm直接无视某些文
  • Window下用caffe实现MNIST训练

    本博包含MNIST原始数据的格式转化 以及分类训练 1 数据转化 Caffe源码中src caffe caffe examples mnist convert mnist data cpp提供的实现代码并不能直接在Windows下运行 这里
  • Filebeat监控 日志监控

    介绍 filebeat提供了两种监控 一种直接推送到ES集群 第二种就是Metricbeat 这里介绍第一种 也就四部 第1步 创建认证 账号密码 这一步基本可以略过了 如果你的filebeat在运行 你肯定已经有账号密码了 第2步 配置f
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 基于Zinx框架实现轻量级TCP服务器

    一 框架部分 包括一个sever 两个读 写模块 一个API管理 一个消息队列管理 一个读写池 建目录一个抽样层 一个实体层 二 基于zinx服务器的应用 对于一个框架 越简单来说越好 V0 1 简单的服务器客户端 1 对于开始 完成简单的