Zinx框架-游戏服务器开发001:zinx框架的安装

news2025/1/20 7:15:11

文章目录

  • 1 zinx下载地址
    • 1.1 zinx框架的源码路径:
    • 1.2 安装好之后动态库的位置
  • 2 Zinx框架运行的基本概况
  • 3 测试Zinx-框架的基本使用
    • 3.0 流程预览
    • 3.1 初始化框架
    • 3.2 标准输入回显标准输出的编写思路
      • 3.2.1 回显Echo
      • 3.2.2 写标准输入stdin通道类,用通道输入-通过 Ichannel 继承
      • 3.2.3 标准输出通道输出-通过 Ichannel 继承
    • 3.3 将通道对象添加到框架
    • 3.4 添加命令处理类
      • 3.4.1 GetNextHandler
      • 3.4.2 CmdHandler
      • 3.4.3 ExitFramework
      • 3.4.4 AddDate
    • 3.6 总览

1 zinx下载地址

1.1 zinx框架的源码路径:

https://github.com/marklion/zinx.git

1.2 安装好之后动态库的位置

cp libzinx.so /usr/lib/
cp *.h /usr/include/

2 Zinx框架运行的基本概况

在这里插入图片描述

3 测试Zinx-框架的基本使用

3.0 流程预览

+----------------+               +------------------+
| console input  +-------------> |TestStdin::ReadFd |
+----------------+               +--------+---------+
                                          |
                                          |
                                          |
                                          v
                                +---------+----------+
                                |Echo::InternelHandle|
                                +---------+----------+
                                          |
                                          |
                                          |
                                          |
                                          v
+---------------+               +---------+----------+
| console output+<--------------+TestSTDOut::WriteFd |
+---------------+               +--------------------+

3.1 初始化框架

/*1-初始化框架*/
	ZinxKernel::ZinxKernelInit();

3.2 标准输入回显标准输出的编写思路

  1. 创建三个类:标准输入类,回显类,标准输出类
  2. 重写标准输入类的读取函数
  3. 重写回显类处理函数
  4. 重写标准输出类的写出函数
  5. 创建以上三个类的全局对象(堆对象),添加通道对象到框架 (kernel)
  6. 运行框架

3.2.1 回显Echo

从哪里输入的不用管,只需要关心参数。
IZinxMsg& _oInput 来自于上一个环节。

/*2-写功能处理类*/
class Echo :public AZinxHandler {

	virtual IZinxMsg* InternelHandle(IZinxMsg& _oInput) override
	{
		/*回显到标准输出*/
		GET_REF2DATA(BytesMsg, input, _oInput);

		//写一个标准输出类的通道,交给通道进行输出
		Ichannel* poSendOut = ZinxKernel::Zinx_GetChannel_ByInfo("stdout");
		if (NULL != poSendOut)
		{
			ZinxKernel::Zinx_SendOut(input.szData, *poSendOut);
		}
		return nullptr;
	}

	virtual AZinxHandler* GetNextHandler(IZinxMsg& _oNextMsg) override
	{
		return nullptr;
	}
} *poEcho = new Echo();

3.2.2 写标准输入stdin通道类,用通道输入-通过 Ichannel 继承

/*3-写通道类*/
class TestStdin :public Ichannel {
	// 通过 Ichannel 继承
	virtual bool Init() override
	{
		return true;
	}
	virtual bool ReadFd(std::string& _input) override
	{
		cin >> _input;
		return true;
	}
	virtual bool WriteFd(std::string& _output) override
	{
		return false;
	}
	virtual void Fini() override
	{
	}
	virtual int GetFd() override
	{
		return 0;
	}
	virtual std::string GetChannelInfo() override
	{
		return "stdin";
	}
	virtual AZinxHandler* GetInputNextStage(BytesMsg& _oInput) override
	{
		return poCmd;
	}
};

注意这里,GetChannelInfo()只负责获取stdin,然后下一步交给回显poCmd做。这里需要一个poCmd,因此在3.2定义类的时候直接创建new了一个对象 *poEcho = new Echo();,作为全局对象。

virtual AZinxHandler* GetInputNextStage(BytesMsg& _oInput) override
{
	return poCmd;
}

3.2.3 标准输出通道输出-通过 Ichannel 继承

/*创建标准输出通道类*/
class TestStdout :public Ichannel {
	// 通过 Ichannel 继承
	virtual bool Init() override
	{
		return true;
	}
	virtual bool ReadFd(std::string& _input) override
	{
		return false;
	}
	virtual bool WriteFd(std::string& _output) override
	{
		cout << _output << endl;
		return true;
	}
	virtual void Fini() override
	{
	}
	virtual int GetFd() override
	{
		return 1;
	}
	virtual std::string GetChannelInfo() override
	{
		return "stdout";
	}
	virtual AZinxHandler* GetInputNextStage(BytesMsg& _oInput) override
	{
		return nullptr;
	}
} *poOut = new TestStdout();

3.3 将通道对象添加到框架

TestStdin* poStdin = new TestStdin();
ZinxKernel::Zinx_Add_Channel(*poStdin);
ZinxKernel::Zinx_Add_Channel(*poOut);

3.4 添加命令处理类

  1. 创建命令处理类继承AzinxHandler,重写处理函数和获取下一个处 理环节的函数
  2. 处理函数内,根据输入内容不同,要么添加输出通道,要么摘除输 出通道
  3. 获取下一个处理环节函数中,指定下一个环节是退出或回显
  4. 设定输入通道的下一个环节是该类对象

在这里插入图片描述

3.4.1 GetNextHandler

	virtual AZinxHandler* GetNextHandler(IZinxMsg& _oNextMsg) override
	{
		GET_REF2DATA(BytesMsg, oBytes, _oNextMsg);
		if (oBytes.szData == "exit")
		{
			return poExit;
		}
		else
		{
			if (0 == status)
			{
				return poEcho;
			}
			else
			{
				return poAddDate;
			}
		}
	}
} *poCmd = new CmdHandler();

3.4.2 CmdHandler


class CmdHandler :public AZinxHandler {
	int status = 0;
	// 通过 AZinxHandler 继承
	virtual IZinxMsg* InternelHandle(IZinxMsg& _oInput) override
	{
		/*判断输入是否是open或close,执行不同操作*/
		GET_REF2DATA(BytesMsg, oBytes, _oInput);

		if (oBytes.szData == "open")
		{
			ZinxKernel::Zinx_Add_Channel(*poOut);
			return NULL;
		}
		else if (oBytes.szData == "close")
		{
			ZinxKernel::Zinx_Del_Channel(*poOut);
			return nullptr;
		}
		else if (oBytes.szData == "date")
		{
			status = 1;
			return nullptr;
		}
		else if (oBytes.szData == "cleardate")
		{
			status = 0;
		}

		return new BytesMsg(oBytes);
	}

3.4.3 ExitFramework

class ExitFramework :public AZinxHandler {
	// 通过 AZinxHandler 继承
	virtual IZinxMsg* InternelHandle(IZinxMsg& _oInput) override
	{
		GET_REF2DATA(BytesMsg, obyte, _oInput);

		if (obyte.szData == "exit")
		{
			ZinxKernel::Zinx_Exit();
			return NULL;
		}
		/*创建交给下一个环节处理的数据*/
		return new BytesMsg(obyte);
	}
	virtual AZinxHandler* GetNextHandler(IZinxMsg& _oNextMsg) override
	{
		return poEcho;
	}
} *poExit = new ExitFramework();

3.4.4 AddDate


class AddDate :public AZinxHandler {
	// 通过 AZinxHandler 继承
	virtual IZinxMsg* InternelHandle(IZinxMsg& _oInput) override
	{
		GET_REF2DATA(BytesMsg, oBytes, _oInput);
		time_t tmp;
		time(&tmp);
		string szNew = string(ctime(&tmp)) + oBytes.szData;
		BytesMsg* pret = new BytesMsg(oBytes);
		pret->szData = szNew;
		return pret;
	}
	virtual AZinxHandler* GetNextHandler(IZinxMsg& _oNextMsg) override
	{
		return poEcho;
	}
} *poAddDate = new AddDate();

3.6 总览

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

协同办公系统:企业提质增效的利器

随着科技的不断发展&#xff0c;企业对于提高工作效率、优化管理流程、降低成本的需求日益迫切。协同办公系统应运而生&#xff0c;成为了许多企业提质增效的利器。那么&#xff0c;协同办公系统究竟是如何帮助企业实现这些目标的呢&#xff1f;本文将从以下几个方面进行详细阐…

【基于MRA:自适应高频融合和注入系数优化:Pansharpening】

Pansharpening Based on Adaptive High-Frequency Fusion and Injection Coefficients Optimization &#xff08;基于自适应高频融合和注入系数优化的全色锐化&#xff09; 全色锐化的目的是将多光谱&#xff08;MS&#xff09;图像与全色&#xff08;PAN&#xff09;图像融…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

私有化部署即时通讯软件WorkPlus,全面适配信创环境

对于企业而言&#xff0c;保护数据的安全至关重要。WorkPlus即时通讯软件允许企业在自己的服务器上部署一套私有化的聊天工具&#xff0c;确保数据完全受控于企业内部。通过私有化部署&#xff0c;企业可以有效地管理和保护敏感信息&#xff0c;防止数据泄露和滥用。 另外&…

React基础知识02

一、通过属性来传值&#xff08;props&#xff09; react中可以使用属性&#xff08;props&#xff09;可以传递给子组件&#xff0c;子组件可以使用这些属性值来控制其行为和呈现输出。 例子&#xff1a; // 1.1 父组件 import React, { useState } from react // 1.2引入子…

浅谈安科瑞直流电表在荷兰光伏充电桩系统中的应用

摘要&#xff1a;本文介绍了安科瑞直流电表在荷兰光伏充电桩系统中的应用。主要用于充电桩的电流电压电能的计量。 Abstract: This article introduces the application of Acrel DC meters in PV charging pile system in Netherlands.The device is measuring current,volt…

腾讯云域名备案后,如何解析到华为云服务器Linux宝塔面板

一、购买域名并且进行备案和解析&#xff0c;正常情况下&#xff0c;购买完域名&#xff0c;如果找不到去哪备案&#xff0c;可以在腾讯云上搜索“备案”关键词就会出现了&#xff0c;所以这里不做详细介绍&#xff0c;直接进行步骤提示&#xff1a; 二、申请ssl证书&#xff0…

mysql简单备份和恢复

版本&#xff1a;mysql8.0 官方文档 &#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 7 Backup and Recovery 1.物理备份恢复 物理备份是以数据文件形式备份。这种方式效率高点&#xff0c;适合大型数据库备份。物理备份可冷备可热备。 使用mysqlbackup 命令进行物理备…

命名数据网络(NDN)介绍

命名数据网络的由来 IP网络最开始其解决的问题是两个实体间点对点通信需求&#xff0c;实现资源共享。&#xff08;简单知道即可&#xff09; 随着互联网的发展&#xff0c;互联网用户对internet的需求现已经发生了巨大变化。目前面临着以下挑战 首先是随着以内容为中心&…

力扣刷题 day63:11-02

1.字符串中的第一个唯一字符 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 方法一&#xff1a;两次遍历哈希表 #方法一&#xff1a;两次遍历哈希表 def firstUniqChar(s):d{}for i in s:if …

Leetcode—707.设计链表【中等】双链表的设计明天再写

2023每日刷题&#xff08;十七&#xff09; Leetcode—707.设计链表 设计单链表实现代码 typedef struct Node {int val;struct Node* next; } MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList* mList (MyLinkedList *)malloc(sizeof(MyLinkedList));mList-&…

知乎盈利来源分析与指标体系构建

知乎用户画像 知乎所属行业&#xff1a;内容社区平台 知乎上的内容涉及的领域&#xff1a; 婚恋情感&#xff08;300亿总阅读量&#xff0c;截止2022年12月&#xff09;、法律纠纷&#xff08;200亿&#xff09;、教育&#xff08;200亿&#xff09;、游戏&#xff08;150亿&…

React实现文本框输入文字内容动态给图片添加文字信息(多个)并生成新的图片

文章目录 思路一思路二1. 下载html2canvas依赖包2. 搭建页面,并且创建新增节点的区域3. 初始化新增第一个节点到页面中的某个指定模块4. 当文本框发生变动&#xff0c;修改节点信息5. 实现节点删除6. 利用html2canvas将模块生成canvas&#xff0c;然后转化成图片 完整代码 收到…

Leetcode刷题详解——汉诺塔问题

1. 题目链接&#xff1a;面试题 08.06. 汉诺塔问题 2. 题目描述&#xff1a; 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放…

【Web】TCP 和 UCP 的含义和区别

文章目录 一、两者含义二、两者区别 一、两者含义 TCP/IP 协议组为传输层指明了两个协议&#xff1a;TCP 和 UDP&#xff0c;他们都是作为应用程序和网络操作的中介物 TCP &#xff08;传输控制协议&#xff09;&#xff1a;通过三次握手建立可靠的连接&#xff0c;发送端将数据…

Excel自学三部曲_Part3:Excel工作场景实战(二)

文章目录 二、基础概念、表格结构与常用函数1. 业务背景、字段含义2. 筛选、排序、冻结窗格3. 状态栏数据提示、调整数据显示格式4. 公式、引用、溢出5. 连接和提取函数、时间函数、IF和IFS函数、SUMIF和SUMIFS函数&#xff08;1&#xff09;每个业务组的成交额有多少&#xff…

解决使用IDEA启动SpringBoot项目报错 java: 警告: 源发行版 17 需要目标发行版 17 或者 java: 无效的目标发行版: 17

问题描述 今天新建了个SpringBoot项目&#xff0c;在启动的时候报错如下&#xff1a; java: 警告: 源发行版 17 需要目标发行版 17 分析问题 其实错误已经很明显了&#xff0c;由于我本地只有JDK8的环境&#xff0c;但是项目以及编译器的JDK是17&#xff0c;这时候把JDK版本修…

提示3D标题编辑器仍在运行如何解决 3D标题编辑器怎么使用

品牌型号&#xff1a;联想GeekPro 2020 系统&#xff1a;Windows 10 64位专业版 软件版本&#xff1a;会声会影2023旗舰版 3D标题因其独特的表现形式和多变的画面效果&#xff0c;被广泛应用于节目片头、宣传片、开幕式等诸多场景之中。掌握3D标题的使用技巧&#xff0c;能够…

SecureCRT 手动全部Tab窗口重连

在工作了一天后&#xff0c;到第二天上班的时候&#xff0c;前一天连接的服务会断开&#xff0c;因为公司内部网络自动断开了&#xff0c;所以一个个重新连接和登录 &#xff0c;用脚本轻松搞定。 # $language "VBScript" # $interface "1.0"Dim g_objTa…

数组基础知识三

二分查找法&#xff1a;也叫折半查找算法。二分查找针对的是一个有序的数据集合&#xff0c;每次都通过跟区间的中间元素对比&#xff0c;将待查找的区间缩小为之前的一半&#xff0c;直到找到要查找的元素&#xff0c;或者区间被缩小为 0。 #include <stdio.h>int main…