游戏服务器框架php,golang -Pitaya 游戏服务器框架中文API教程
golang -Pitaya 是一种简单、快速、轻量级游戏服务器和集群支持框架和客户端库iOS、Android,团结和其他人通过C SDK。它提供了一个基本的分布式多人游戏和服务器端应用程序开发框架。
先决条件Go >= 1.10
etcd (用于服务发现)
nats (可选的,用于发送和接收rpc, grpc实现也可以使用,如果喜欢的话)
docker (可选:用于在容器上运行etcd和nats依赖项)
安装
clone the repogit clone https://github.com/topfreegames/pitaya.git
setup pitaya dependenciesmake setup
Hacking pitaya
下面是一个跑pitaya的例子:
启动etcd(此命令需要docker-compose,并将在本地运行etcd容器。etcd可以在没有docker的情况下运行。cd ./examples/testing && docker-compose up -d etcd
run the connector frontend server from cluster_grpc examplemake run-cluster-grpc-example-connector
run the room backend server from the cluster_grpc examplemake run-cluster-grpc-example-room
Now there should be 2 pitaya servers running, a frontend connector and a backend room. To send requests, use a REPL client for pitaya pitaya-cli.$ pitaya-cli
Pitaya REPL Client>>> connect localhost:3250connected!>>> request room.room.entry>>> sv-> {"code":0,"result":"ok"}
Running the testsmake test
This command will run both unit and e2e tests.
Contributing
#TODO
AuthorsTFG Co - Initial work
License
Acknowledgementsnano authors for building the framework pitaya is based on.
pomelo authors for the inspiration on the distributed design and protocol
Resources
一个聊天的demopackage main
import (
"context"
"fmt"
"log"
"net/http"
"strconv"
"time"
"strings"
"github.com/spf13/viper"
"github.com/topfreegames/pitaya"
"github.com/topfreegames/pitaya/acceptor"
"github.com/topfreegames/pitaya/component"
"github.com/topfreegames/pitaya/config"
"github.com/topfreegames/pitaya/groups"
"github.com/topfreegames/pitaya/logger"
"github.com/topfreegames/pitaya/serialize/json"
"github.com/topfreegames/pitaya/timer"
)
type (
// Room represents a component that contains a bundle of room related handler
// like Join/Message
Room struct {
component.Base
timer *timer.Timer
}
// UserMessage represents a message that user sent
UserMessage struct {
Name string `json:"name"`
Content string `json:"content"`
}
// NewUser message will be received when new user join room
NewUser struct {
Content string `json:"content"`
}
// AllMembers contains all members uid
AllMembers struct {
Members []string `json:"members"`
}
// JoinResponse represents the result of joining room
JoinResponse struct {
Code int `json:"code"`
Result string `json:"result"`
}
)
// NewRoom returns a Handler Base implementation
func NewRoom() *Room {
return &Room{}
}
// AfterInit component lifetime callback
func (r *Room) AfterInit() {
r.timer = pitaya.NewTimer(time.Minute, func() {
count, err := pitaya.GroupCountMembers(context.Background(), "room")
logger.Log.Debugf("UserCount: Time=> %s, Count=> %d, Error=> %q", time.Now().String(), count, err)
})
}
// Join room
func (r *Room) Join(ctx context.Context, msg []byte) (*JoinResponse, error) {
s := pitaya.GetSessionFromCtx(ctx)
fakeUID := s.ID() // just use s.ID as uid !!!
err := s.Bind(ctx, strconv.Itoa(int(fakeUID))) // binding session uid
if err != nil {
return nil, pitaya.Error(err, "RH-000", map[string]string{"failed": "bind"})
}
uids, err := pitaya.GroupMembers(ctx, "room")
if err != nil {
return nil, err
}
s.Push("onMembers", &AllMembers{Members: uids})
// notify others
pitaya.GroupBroadcast(ctx, "chat", "room", "onNewUser", &NewUser{Content: fmt.Sprintf("New user: %s", s.UID())})
// new user join group
pitaya.GroupAddMember(ctx, "room", s.UID()) // add session to group
// on session close, remove it from group
s.OnClose(func() {
pitaya.GroupRemoveMember(ctx, "room", s.UID())
})
return &JoinResponse{Result: "success"}, nil
}
// Message sync last message to all members
func (r *Room) Message(ctx context.Context, msg *UserMessage) {
err := pitaya.GroupBroadcast(ctx, "chat", "room", "onMessage", msg)
if err != nil {
fmt.Println("error broadcasting message", err)
}
}
func main() {
defer pitaya.Shutdown()
s := json.NewSerializer()
conf := configApp()
pitaya.SetSerializer(s)
gsi := groups.NewMemoryGroupService(config.NewConfig(conf))
pitaya.InitGroups(gsi)
err := pitaya.GroupCreate(context.Background(), "room")
if err != nil {
panic(err)
}
// rewrite component and handler name
room := NewRoom()
pitaya.Register(room,
component.WithName("room"),
component.WithNameFunc(strings.ToLower),
)
log.SetFlags(log.LstdFlags | log.Llongfile)
http.Handle("/web/", http.StripPrefix("/web/", http.FileServer(http.Dir("web"))))
go http.ListenAndServe(":3251", nil)
t := acceptor.NewWSAcceptor(":3250")
pitaya.AddAcceptor(t)
pitaya.Configure(true, "chat", pitaya.Cluster, map[string]string{}, conf)
pitaya.Start()
}
func configApp() *viper.Viper {
conf := viper.New()
conf.SetEnvPrefix("chat") // allows using env vars in the CHAT_PITAYA_ format
conf.SetDefault("pitaya.buffer.handler.localprocess", 15)
conf.Set("pitaya.heartbeat.interval", "15s")
conf.Set("pitaya.buffer.agent.messages", 32)
conf.Set("pitaya.handler.messages.compression", false)
return conf
}
游戏服务器框架php,golang -Pitaya 游戏服务器框架中文API教程相关推荐
- golang游戏服务器项目,基于Golang的游戏服务器框架cellnet开发日记(一)
启程的故事 使用Golang写服务器是一件非常幸福的事情. 不用长时间的等待编译, 零依赖部署. 开发效率高, 多出的时间陪陪家人, 看书充充电多好. 所以Golang就像是手机界的苹果, 从发布后, ...
- linux环境搭建golang服务器,Linux下golang环境搭建-Go语言中文社区
1.首先从使用wget https://storage.googleapis.com/golang/go1.12.linux-amd64.tar.gz命令下载安装包,可以根据自己的需要选择版本. 2. ...
- ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器
ioGame 国内首个基于蚂蚁金服 SOFABolt 的 java 网络游戏服务器框架:无锁异步化.事件驱动的架构设计 通过 ioGame 可以很容易的搭建出一个集群无中心节点.有状态多进程的分步式游 ...
- 包含对象名字的游戏id_教你从头写游戏服务器框架(三)
关于作者:韩伟,腾讯互娱高级工程师,目前在Next产品中心研发创新类型游戏. 本文为系列文章的第 3篇 第一篇:教你从头写游戏服务器框架(1) 第二篇:教你从头写游戏服务器框架(2) 协 程 ...
- java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架
网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架.支持 websocket.tcp ,适用于全球同服.回合制游戏.策略游戏.即时战斗等游戏服务器的开发.具有高性能.稳定 ...
- et框架做游戏服务器性能好吗,et游戏服务器框架
et游戏服务器框架 内容精选 换一换 华为云视频分析服务帮助中心,为用户提供产品简介.用户指南.API参考.常见问题等技术文档,帮助您快速上手使用视频分析服务. ServiceStage是一个应用托管 ...
- (十三)nodejs循序渐进-高性能游戏服务器框架pomelo之扩展聊天服务器为机器人自动聊天
聊天服务器扩展 大家在上一篇文章里相信已经学会了pomelo框架的基本用法了,那么我们在上一篇文章的代码基础上继续扩展,丰富系统,另外也熟悉下他的更多的用法,这一节我将扩展它:增加一个机器人自动聊天的 ...
- java游戏服务器面试_我做游戏开发这八年
点击上方"CSDN学院精品课",选择"置顶公众号" CSDN学院精品课 IT人的职业提升平台 作者 | kakashi8841 简述这篇文章并不是想教会大家如 ...
- gpu云服务器运行游戏_GPU云服务器可以挂在大型游戏吗
随着科技的发展,云服务器和网络游戏都是互联网发展的产物.现在随着网络的广泛发展和使用,云服务器和游戏都是现在比较火热的行业,云服务器基于云计算技术的发展,用于存放网站数据,在现在的生产工作中占据重要地 ...
最新文章
- 39[dropbox etc]
- 计算机毕业论文多久,计算机毕业论文
- 如何使用Nikto漏洞扫描工具检测网站安全
- java学习(142):file类的基本创建
- LeetCode题解 343.Integer Break
- Spring Boot参数校验
- 蚂蚁集团前三季度营收1181.91亿元 支付宝月活用户7.31亿
- nginx做代理服务
- 13、几点小结,unsigned long long
- php168 shell,php168 v6/v7鸡肋Getshell安全问题
- labelcommand打印条码_Zebra条码打印机编程命令
- 智慧屏如何连接电视盒子
- 实现了一个简单的以图搜图功能(带代码)
- c语言n个自然数得阶乘求和,计算n个自然数阶乘的和
- ECCV 2022 Oral | 无需微调即可泛化!RegAD:少样本异常检测新框架
- 百度云网盘不限速下载之Google Chrome浏览器+SwitchyOmega插件
- PCIE DWC - 3 - PCI-PM Software Compatible Mechanisms
- pom 文件的project标签报错Failed to read artifact descriptor for xxx:jar
- 区块链+大数据:万物互联时代的“CP组合”
- 程序员的量化交易之路(26)--Cointrader之Listing挂牌实体(13)
热门文章
- Qt之控件绘制圆角(可以实现任意角度为圆角)
- 光学设计手册学习(一)——望远镜系统
- 华为云提供“多云灾备”三大方案,为云上业务无中断保驾护航
- 安卓逆向_19( 二 ) --- APK保护策略【重新签名后安装打开失败 --- 书旗小说.apk、浦发银行.apk的过签名校验【so 文件修改保存】】...
- 2022史上最全java面试题题库大全800题含答案
- 背单词软件 基于VS2019 EasyX (C语言实现)
- js数组求和、最大、最小值
- Java中字节Byte和位Bit的关系
- 为什么光荣公司做的三国游戏比中国人做的越来越好
- Matlab的simplify函数化简符号表达式