前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >gsky简易高性能游戏服务器框架库1

gsky简易高性能游戏服务器框架库1

原创
作者头像
i0gan
修改于 2021-06-30 10:09:39
修改于 2021-06-30 10:09:39
61400
代码可运行
举报
文章被收录于专栏:I0ganI0gan
运行总次数:0
代码可运行

有时候方便自己快速开发小游戏服务器,自己采用go,python,c#那些也简单写过一点游戏后台,但是针对与socket长连接,感觉有点不太好控制,go稍微好些,这个项目是以前写的web服务器,最近在搞游戏项目,把它移植为一个库,且采用psp(pwnsky protocol)二进制传输协议更快速应对客户请求。

github链接: https://github.com/pwnsky/gsky

若有师傅们想参与一起完善维护的可以私信我: QQ: 418894113。

下面是一些简单的使用例子,后期得把文档完善一下。

介绍

为了便于更快速开发高性能游戏服务器,特意基于lgx web服务器框架,二次开发且封装为一个服务器库。 gsky是一个基于epoll架构的高性能游戏服务器库,采用更快速的psp (pwnsky protocol)二进制协议进行传输数据。

如何使用?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/pwnsky/gsky.git
cd gsky
make -j # 编译gsky库
make install # 安装gsky库

该库提供编译好的.so文件以及api头文件,更利于开发和编译服务器。

编译成功后,所有文件在build目录下,如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
build
├── include
│   └── gsky
│       ├── gsky.hh # gsky服务器总声明
│       ├── log # 日志模块
│       │   ├── log.hh
│       │   └── log_thread.hh
│       ├── net # 网络模块
│       │   ├── channel.hh
│       │   ├── epoll.hh
│       │   ├── eventloop.hh
│       │   ├── eventloop_thread.hh
│       │   ├── eventloop_threadpool.hh
│       │   ├── net.hh
│       │   ├── psp.hh
│       │   └── util.hh
│       ├── server.hh
│       ├── thread # 线程模块
│       │   ├── condition.hh
│       │   ├── count_down_latch.hh
│       │   ├── mutex_lock.hh
│       │   ├── noncopyable.hh
│       │   └── thread.hh
│       ├── util # 工具模块
│       │   ├── firewall.hh
│       │   ├── json.hh
│       │   ├── md5.hh
│       │   ├── url.hh
│       │   ├── util.hh
│       │   └── vessel.hh
│       └── work # 逻辑调用模块
│           └── work.hh
└── lib
    └── libgsky.so # 编译好的gsky动态库

详情请查看头文件api。

编译安装好库之后,可以更方便的写游戏服务器了。

例如: https://github.com/pwnsky/gsky/blob/main/example/server_1.cc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// g++ main.cc -lpthread -lgsky -o gsky
// ./gsky -c ../conf/gsky.conf
//
#include <iostream>
#include <signal.h>
#include <unistd.h>

#include <gsky/gsky.hh>
#include <gsky/server.hh>
#include <gsky/work/work.hh>

#define UNUSED(var) do { (void)(var); } while (false)

//extern std::string gsky::data::config_path;
//
std::string gsky::data::os_info;
gsky::server server;

void gsky_exit(int s) {
    UNUSED(s);
    server.stop();
}

void help() {
    std::cout << "Usage: ./gsky [OPTION...] [SECTION] PAGE...\n"
                "-c   load configure file\n"
                "-h   help of gsky server\n"
                "-v   check version of gsky server\n"
                 ;
}

enum class RouterRoot {
    Keep = 0,
    CheckUpdate,
    Login,
};

// 服务器回调函数, 函数格式为 void func(gsky::work::work *)
void server_run(gsky::work::work *w) {

    switch((RouterRoot)w->router_[0]) {
        case RouterRoot::Keep: {
            w->send_data("Keep"); // 发送给客户端"Keep"字符串
        } break;
        case RouterRoot::CheckUpdate: {
            std::cout << "checking updateing\n";
        } break;
        case RouterRoot::Login: {
            std::cout << "Login\n";
        } break;
        default: {
            w->send_data(w->content_.to_string()); // 回显输入的内容
        } break;
    }
}

int main(int argc, char **argv) {
    ::signal(SIGINT, gsky_exit); // Ctrl + c 退出服务器
    int opt = 0;
    gsky::data::config_path = DEFAULT_CONFIG_FILE;
    while((opt = getopt(argc, argv,"h::v::a::c:"))!=-1) {
        switch (opt) {
        case 'h': {
            help();
            exit(0);
        } break;
        case 'c': {
            // 设置服务器配置文件路径
            server.set_config_path(optarg);
        } break;
        case 'v': {
            // 显示 gsky lib 的版本号
            std::cout << "gsky version: " << gsky::version() << '\n';
            exit(0);
        } break;
        default: {
            std::cout << "-h get more info" << std::endl;
            exit(0);
        }
        }
    }

    // 设置服务器回调函数
    server.set_func_handler(server_run);
    server.run(); // 启动gsky服务器
    std::cout << "\033[40;33mgsky quited! \n\033[0m";
    return 0;
}

编译的时候

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ -lgsky -lpthread main.cc

运行该程序需要指定下配置文件,一般常用配置文件在https://github.com/pwnsky/gsky/blob/main/conf/gsky.conf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "protocol": "psp",
    "port" : 8080,
    "number_of_thread": 4,
    "log" : "./gsky.log",
    "firewall" : {
    }
}

设置好配置文件之后加上-c参数指定配置文件路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./gsky -c ../conf/gsky.conf

若出现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gsky server port: 8080  number of thread: 4

则说明运行成功了。

测试服务

由于服务器采用psp协议进行传输的,使用example/client.py进行测试,若想使用psp协议客户端,则访问https://github.com/pwnsky/psp下载相应的客户端psp协议库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./client.py
send...
recv: 
router: b'\x00\x00\x00\x00' length: 4
b'Keep'

若运行出现以上内容,则服务器正常运行了。

详情更多,请看测试目录下的例子。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
云游戏服务器如何配置?游戏服务器一般会遇到哪些攻击?
随着互联网技术的飞速发展,游戏行业越来越受欢迎,许多游戏商家都在开发新游戏,目的就是为了吸引众多玩家进入游戏页面,实现赚取收益的目的。当然游戏开发离不开服务器,那么云游戏服务器如何配置?游戏服务器一般会遇到哪些攻击?
用户8715145
2021/11/05
1.2K0
游戏服务器框架 Leaf/go
Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率 并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性: * 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 * 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 * 多核支持。Leaf 通过模块机制和 leaf/go 尽可能的利用多核资源,同时又尽量避免各种副作用 * 良好的模块支持。 一个 Leaf 开发的游戏服务器由多个模块组成(例如 LeafServer),模块有以
李海彬
2018/03/22
5.7K0
教你从头写游戏服务器框架
大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发。这些新的游戏项目,比较接近独立游戏的开发方式。我觉得公司的“祖传”服务器框架技术不太适合,所以从头写了一个游戏服务器端的框架,以便获得更好的开发效率和灵活性。现在项目将近上线,有时间就想总结一下,这样一个游戏服务器框架的设计和实现过程。
韩伟
2019/01/30
4.3K1
教你从头写游戏服务器框架
go实现一个简单的游戏服务器框架(lotou)起源
https://github.com/sydnash/lotou 目前代码比较粗糙,欢迎各种改进建议。 最近一直想学习一些关于游戏服务器的知识,显示看了一下云风的skynet框架,从而对于一个游戏服务器框架有了一个基本概要了解。先来说说我对于skynet的一些理解吧。 skynet理解 skynet只完成了服务器最核心的一部分功能,必须消息分发,必须服务的创建、销毁以及服务间的通信。 skynet中最核心的两个部分,网络和消息分发。 消息分发 skynet中有一个消息队列的队列,这个队列保存了每一个服务
李海彬
2018/03/27
1.7K0
Leaf 游戏服务器框架简介
下载地址: https://github.com/name5566/leaf/blob/master/TUTORIAL_ZH.md Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。 Leaf 的关注点: 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 多核支持。
李海彬
2018/03/26
2.5K0
【专业技术】如何搭建游戏服务器?
存在问题: 手游越来越火了,听听业内人士的分析,他山之石,多多借鉴,那么手游的服务器到底如何搭建的? 解决方案: 从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术。(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多) 一.聊聊服务器开发有哪些东西要考虑。 1.开发语言的选择: 工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用。 业界主要的是c/c++ + Pyt
程序员互动联盟
2018/03/15
12.6K0
教你从头写游戏服务器框架(3)
使用异步非阻塞编程,确实能获得很好的性能。但是在代码上,确非常不直观。因为任何一个可能阻塞的操作,都必须要要通过“回调”函数来链接。比如一个玩家登录,你需要先读数据库,然后读一个远程缓冲服务器(如 redis),然后返回登录结果:用户名、等级……在这个过程里,有两个可能阻塞的操作,你就必须把这个登录的程序,分成三个函数来编写:一个是收到客户端数据包的回调,第二个是读取数据库后的回调,第三个是读取缓冲服务器后的回调。
韩伟
2019/05/08
2.9K3
教你从头写游戏服务器框架(3)
一个简单的游戏服务器框架_游戏开发
最近一段时间不是很忙,就写了一个自己的游戏服务器框架雏形,很多地方还不够完善,但是基本上也算是能够跑起来了。我先从上层结构说起,一直到实现细节吧,想起什么就写什么。 第一部分 服务器逻辑 服务
李海彬
2018/03/21
3.2K0
一个简单的游戏服务器框架_游戏开发
使用 Kubernetes 扩展专用游戏服务器:第4部分-缩减节点
在前三篇文章中,我们将游戏服务器托管在 Kubernetes 上,测量并限制它们的资源使用,并根据使用情况扩大集群中的节点。现在我们需要解决更困难的问题:当资源不再被使用时,缩小集群中的节点,同时确保正在进行的游戏在节点被删除时不会中断。
为少
2021/05/27
6820
使用 Kubernetes 扩展专用游戏服务器:第4部分-缩减节点
腾讯云游戏服务器怎么样 云游戏服务器能够打游戏吗
随着互联网时代的发展,游戏渐渐成为人们下班解压的方式之一。游戏之所以能够在每一个人的电脑中呈现华丽的界面,主要是通过云服务器来传输的。对于经常玩腾讯旗下的游戏的玩家来说,并不清楚腾讯云游戏服务器怎么样?接下来就给大家介绍一下。
用户8715145
2021/11/04
6.3K0
什么是云游戏服务器?云游戏服务器架构存在哪些挑战?
云游戏和云计算技术在这两年非常热门,因为云计算技术能够帮助不少领域解决领域内所存在的难题。游戏作为大多数的日常生活的消遣,也受到了很多人的关注,那么什么是云游戏服务器?云游戏服务器架构存在哪些挑战?
用户8715145
2021/11/11
1.7K0
探索使用Kubernetes扩展专用游戏服务器:第3部分 - 扩展节点
在前两篇文章中,我们研究了如何在 Kubernetes 上托管专用游戏服务器,并测量和限制其内存和 CPU 资源。在本期中,我们将探讨如何利用上一篇文章中的 CPU 信息来确定何时需要扩展Kubernetes 集群,因为随着玩家人数的增加,我们已经没有足够的空间来容纳更多的游戏服务器。
为少
2021/05/27
7030
探索使用Kubernetes扩展专用游戏服务器:第3部分 - 扩展节点
Gsky游戏服务器框架2
这几天主要是完善 pp (pwnsky protocol)二进制加密传输协议,还有该框架的拓展性。
i0gan
2021/07/03
3880
游戏服务器和Web服务器的区别
用Go语言写游戏服务器也有一个多月了,也能够明显的感受到两者的区别。这篇文章就是想具体的聊聊其中的区别。当然,在了解区别之间,我们先简单的了解一下Go语言本身。
tengxunyun8点com活动整理
2019/10/16
3.1K0
游戏服务器和Web服务器的区别
自己建云游戏服务器 云游戏服务器被攻击了怎么办
现在游戏已经成为了大家日常生活中的常见娱乐活动之一。为了能让自己有很多的游戏体验,很多小伙伴都喜欢自己购买云游戏服务器承载游戏运行,让游戏变得更加顺畅,网络变得更加平稳快速。那么自己建云游戏服务器的方法是什么,下面就给大家简单说一说。
用户8715145
2021/11/04
1.7K0
构建云游戏服务器有哪些要求,为什么要构建云游戏服务器
云服务器大家都听过,但是云游戏服务器不知道大家有没有所了解。云服务在这两年可以说是非常火爆,他能够做的事情也很多,比如让我们随时随地进行办公,让我们在任何时候都能够使用到电脑的云电脑服务,现在我们甚至可以通过云服务器来实现云游戏的这项功能。但是构建云游戏服务器有哪些要求?我们构建云游戏又有什么样的好处?今天我们就一起来分析一下。
用户8715145
2021/11/05
7410
Redis在游戏服务器中的应用
排行榜 游戏服务器中涉及到很多排行信息,比如玩家等级排名、金钱排名、战斗力排名等。 一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合。 但是有时候我们需要每一个玩家的排名,玩家的数量太多,不能利用数据库(全表排序压力太大),自己维护也会比较麻烦。 使用Redis可以很好的解决这个问题。它提供的有序Set,支持每个键值(比如玩家id)拥有一个分数(score),每次往这个set里添加元素, Redis会对其进行排序,修改某一元素的score后,也会
李海彬
2018/03/21
2.3K0
搭建自己的云游戏服务器是什么呢?云游戏服务器有哪些优点?
随着互联网的不断发展,云游戏服务器也越来越受欢迎,云游戏服务器是专门供个人玩云游戏的服务器,它的优势是比较多的,很多人都比较喜欢自己搭建云游戏服务器,这样的话,可以帮助我们获得更好的游戏体验。在搭建云游戏服务器之后,我们可以直接通过压缩传输云游戏,游戏的流畅性是非常强的。不过,对于一些新手小白来说,搭建云服务器也是需要掌握一定的方法的,那么,搭建自己的云游戏服务器方法是什么呢?
用户8715145
2021/11/11
1.4K0
探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器
因为 nanoserver 使用了 xorm,它会自动的根据定义的 model 生成数据库表 schema。
为少
2021/05/27
1.4K0
探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器
游戏服务器概述
(1)了解常见查找/排序算法的特点:利用算法来改善性能,胜于通过编译器选项、编程技巧;
Zoctopus
2018/08/03
4.8K0
游戏服务器概述
推荐阅读
相关推荐
云游戏服务器如何配置?游戏服务器一般会遇到哪些攻击?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验