Zinx源代码

在线开发教程

微信端文档

技术资源分享.jpg

六、构建项目与用户上线

​ 现在,我们应该基于Zinx框架来构建一个MMO的游戏服务器应用程序的项目了。

我们这里创建一个项目mmo_game,在项目内分别创建几个文件夹api,conf,core,game_client,pb等

6.1 构建项目

api:主要是注册一些mmo业务的一些Router处理业务。

conf:存放mmo_game的一些配置文件,比如"zinx.json"。

core:存放一些核心算法,或者游戏控制等模块。

game_client:存放游戏客户端。

pb:存放一些protobuf的协议文件和go文件。

1、我们在mmo_game下,创建一个server.go作为我们main包,主要作为服务器程序的主入口。

mmo_game/server.go

package main

import (

"zinx/znet"

)

func main() {

//创建服务器句柄

s := znet.NewServer()

//启动服务

s.Serve()

}

2、在conf文件添加zinx.conf

mmo_game/conf/zinx.conf

{

"Name":"Zinx Game",

"Host":"0.0.0.0",

"TcpPort":8999,

"MaxConn":3000,

"WorkerPoolSize":10

}

3、在pb下创建msg.proto文件和build.sh编译指令脚本

mmo_game/pb/msg.proto

syntax="proto3"; //Proto协议

package pb; //当前包名

option csharp_namespace="Pb"; //给C#提供的选项

mmo_game/pb/build.sh

#!/bin/bash

protoc --go_out=. *.proto

当前我们的项目路径应该结构如下:

.

└── mmo_game

├── api

├── conf

│ └── zinx.json

├── core

│ ├── aoi.go

│ ├── aoi_test.go

│ ├── grid.go

├── game_client

│ └── client.exe

├── pb

│ ├── build.sh

│ └── msg.proto

├── README.md

└── server.go

6.2用户上线流程

​ 好了,那么我们第一次就要尝试将客户端的MMO游戏和移动端做一次上线测试了。

我们第一个测试用户上线的流程比较简单:

14-Zinx游戏-上线流程.jpeg

A)定义proto协议

我们从图中可以看到,上线的业务会涉及到MsgID:1 和 MsgID:200 两个消息,根据我们上一个章节的介绍,我们需要在msg.proto中定义出两个proto类型,并且声称对应的go代码.

mmo_game/pb/msg.proto

syntax="proto3"; //Proto协议

package pb; //当前包名

option csharp_namespace="Pb"; //给C#提供的选项

//同步客户端玩家ID

message SyncPid{

int32 Pid=1;

}

//玩家位置

message Position{

float X=1;

float Y=2;

float Z=3;

float V=4;

}

//玩家广播数据

message BroadCast{

int32 Pid=1;

int32 Tp=2;

oneof Data {

string Content=3;

Position P=4;

int32 ActionData=5;

}

}

执行build.sh生成对应的msg.pb.go代码.

B)创建Player模块

首先我们先创建一个Player玩家模块

mmo_game/core/player.go

//玩家对象

type Player struct {

Pid int32 //玩家ID

Conn ziface.IConnection //当前玩家的连接

X float32 //平面x坐标

Y float32 //高度

Z float32 //平面y坐标 (注意不是Y)

V float32 //旋转0-360度

}

/*

Player ID 生成器

*/

var PidGen int32 = 1 //用来生成玩家ID的计数器

var IdLock sync.Mutex //保护PidGen的互斥机制

//创建一个玩家对象

func NewPlayer(conn ziface.IConnection) *Player {

//生成一个PID

IdLock.Lock()

id := PidGen

PidGen ++

IdLock.Unlock()

p := &Player{

Pid : id,

Conn:conn,

X:float32(160 + rand.Intn(10)),//随机在160坐标点 基于X轴偏移若干坐标

Y:0, //高度为0

Z:float32(134 + rand.Intn(17)), //随机在134坐标点 基于Y轴偏移若干坐标

V:0, //角度为0,尚未实现

}

return p

}

Plyaer类中有当前玩家的ID,和当前玩家与客户端绑定的conn,还有就是地图的坐标信,NewPlayer()提供初始化玩家方法。

由于Player经常需要和客户端发送消息,那么我们可以给Player提供一个SendMsg()方法,供客户端发送消息

mmo_game/core/player.go

/*

发送消息给客户端,

主要是将pb的protobuf数据序列化之后发送

*/

func (p *Player) SendMsg(msgId uint32, data proto.Message) {

fmt.Printf("before Marshal data = %+v\n", data)

//将proto Message结构体序列化

msg, err := proto.Marshal(data)

if err != nil {

fmt.Println("marshal msg err: ", err)

return

}

fmt.Printf("after Marshal data = %+v\n", msg)

if p.Conn == nil {

fmt.Println("connection in player is nil")

return

}

//调用Zinx框架的SendMsg发包

if err := p.Conn.SendMsg(msgId, msg); err != nil {

fmt.Println("Player SendMsg error !")

return

}

return

}

这里要注意的是,SendMsg()是将发送的数据,通过proto序列化,然后再调用Zinx框架的SendMsg方法发送给对方客户端.

C)实现上线业务

我们先在Server的main入口,给链接绑定一个创建之后的hook方法,因为上线的时候是服务器自动回复客户端玩家ID和坐标,那么需要我们在连接创建完毕之后,自动触发,正好我们可以利用Zinx框架的SetOnConnStart方法.

mmo_game/server.go

package main

import (

"fmt"

"zinx/ziface"

"zinx/zinx_app_demo/mmo_game/core"

"zinx/znet"

)

//当客户端建立连接的时候的hook函数

func OnConnecionAdd(conn ziface.IConnection) {

//创建一个玩家

player := core.NewPlayer(conn)

//同步当前的PlayerID给客户端, 走MsgID:1 消息

player.SyncPid()

//同步当前玩家的初始化坐标信息给客户端,走MsgID:200消息

player.BroadCastStartPosition()

fmt.Println("=====> Player pidId = ", player.Pid, " arrived ====")

}

func main() {

//创建服务器句柄

s := znet.NewServer()

//注册客户端连接建立和丢失函数

s.SetOnConnStart(OnConnecionAdd)

//启动服务

s.Serve()

}

根据我们之前的流程分析,那么在客户端建立连接过来之后,Server要自动的回复给客户端一个玩家ID,同时也要讲当前玩家的坐标发送给客户端。所以我们这里面给Player定制了两个方法Player.SyncPid()和Player.BroadCastStartPosition()

SyncPid()则为发送MsgID:1的消息,将当前上线的用户ID发送给客户端

mmo_game/core/player.go

//告知客户端pid,同步已经生成的玩家ID给客户端

func (p *Player) SyncPid() {

//组建MsgId0 proto数据

data := &pb.SyncPid{

Pid:p.Pid,

}

//发送数据给客户端

p.SendMsg(1, data)

}

BroadCastStartPosition()则为发送MsgID:200的广播位置消息,虽然现在没有其他用户,不是广播,但是当前玩家自己的坐标也是要告知玩家的。

mmo_game/core/player.go

//广播玩家自己的出生地点

func (p *Player) BroadCastStartPosition() {

msg := &pb.BroadCast{

Pid:p.Pid,

Tp:2,//TP2 代表广播坐标

Data: &pb.BroadCast_P{

&pb.Position{

X:p.X,

Y:p.Y,

Z:p.Z,

V:p.V,

},

},

}

p.SendMsg(200, msg)

}

D)测试用户上线业务

$cd mmo_game/

$go run server.go

启动服务端程序。

​ 然后再windows终端打开client.exe

注意,要确保windows和启动服务器的Linux端要能够ping通,为了方便测试,建议将Linux的防火墙设置为关闭状态,或者要确保服务器的端口是开放的,以免耽误调试

15-zinx游戏案例-客户端登录.png

在此处输入服务器的IP地址,和服务器zinx.json配置的端口号。然后点击Connect。

16-zinx游戏案例-上线登录成功.png

如果游戏界面顺利进入,并且已经显示为Player_1玩家ID,表示等录成功,并且我们在服务端也可以看到一些调试信息。操作WASD也可以进行玩家移动。如果没有显示玩家ID或者为TextView则为登录失败,我们需要再针对协议的匹配进行调试。

关于作者:

作者:Aceld(刘丹冰)

简书号:IT无崖子

原创声明:未经作者允许请勿转载, 如果转载请注明出处

mmo服务器 性能测试,【Zinx应用-MMO游戏案例-(5)构建项目及用户上线】Golang轻量级并发服务器框架...相关推荐

  1. 【项目学习】C++实现高并发服务器——代码学习(一)Reactor高并发模型

    项目来源:WebServer 上一篇:环境搭建 本文介绍以下功能的代码实现 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型: 一.IO复用技术 IO多路复用使得程序能同时监听多 ...

  2. 【项目学习】C++实现高并发服务器——代码学习(二)存储解析HTTP请求报文,创建响应报文

    项目来源:WebServer 上一篇:Reactor高并发模型 本文介绍以下功能的代码实现 利用标准库容器封装char,实现自动增长的缓冲区: 利用正则与状态机解析HTTP请求报文,实现处理静态资源的 ...

  3. 轻量级HTTP服务器Nginx(配置与调试Nginx)(转)

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.linuxidc.com/Linux/2012-03/55868p3.htm Nginx安装完毕后 ...

  4. C++网络编程(四):多进程并发服务器

    部分内容转自Linux并发服务器编程之多进程并发服务器. 目录 前言 创建进程 Linux下的进程 进程创建函数fork与vfork exec函数 使用fork函数实现多进程并发服务器 分割I/O程序 ...

  5. 三菱PLC GX3 全ST程序案例,提供项目源码FB源码

    三菱PLC GX3 全ST程序案例,提供项目源码FB源码,公司级框架 编号:4849645214956251YangQL

  6. 腾讯云服务器性能测试心得经验总结

    前言 回顾几年前,做性能测试,尤其是服务器性能测试难度比较大,一是测试人员本身技术不足,二是测试的生态环境 不够完善(参考资料少.实用案例少.工具选型少),然而在这两年随着测试环境的生态逐步完善,性能 ...

  7. 新一代MMO架构(Next Generation MMO Architecture 翻译)

    http://blog.chinaunix.net/uid-429659-id-3396370.html 新一代MMO架构 原文件Pdf下载: Next_Generation_MMO_Architec ...

  8. was web 服务器性能测试,was web 服务器性能测试

    was web 服务器性能测试 内容精选 换一换 cd /home/ior-master/src/home/OpenMPI/bin/mpirun --allow-run-as-root -machin ...

  9. win服务器性能测试,windows服务器性能测试

    windows服务器性能测试 内容精选 换一换 针对DCS Redis实例的性能评估,比如测试某种实例规格的set或get在某个高并发场景下的性能,可参考本文的测试方法.Redis客户端源码包含一个名 ...

  10. 云服务器性能测试的方法

    云服务器性能测试的方法是什么?主机性能测试的核心一般主要包括两部分:正确的测试方法,正确的评价性能的指标.测试方法会告诉你用什么样的套路去执行测试:性能指标是告诉你如何用数值来描述测试对象的性能. 云 ...

最新文章

  1. PHP开发工具 zend studio
  2. Hadoop源码分析-Text
  3. 基于移位寄存器的序列密码
  4. IIS如何配置可以下载APK、IPA文件
  5. python-list列表排序问题 sort 与 sorted
  6. android adjust,android adjustresize adjustpan着名的问题
  7. vscode 生成mvc_ASP.NET MVC 简介(附VS2019和VSCode版示例)
  8. Atitit.实现反向代理(1)----url rewrite 配置and内容改写 and -绝对路径链接改写 java php
  9. 【预测模型】基于matlab粒子群算法预测【含Matlab源码 1326期】
  10. 塞规公差带图_孔与轴用量规的公差带图
  11. 聚类算法---Kmeans算法、K均值算法
  12. 如何在数据库中存储用户密码_如何在数据库中存储密码
  13. python量化策略——改进的美林时钟介绍(0)
  14. 内网环境下微信扫码登录小结
  15. apache整合tomcat实现web服务器的动静态资源的分离解析
  16. 如何判断两个ip是否属于同一子网;如何确定子网掩码,让300台服务器处于同一网段
  17. Bill Joy (zz.IS2120)
  18. 今天向大家推荐一批大数据书籍,大家可以在业余的时候阅读,加深对大数据的了解
  19. cl 编译器环境配置问题
  20. hashmap与concurrenthashmap源码解析

热门文章

  1. 三角脉冲信号的表达式_脉冲发生器产生一个单三角脉冲,其波形如图所示,例1写出电压U 与.pdf...
  2. 三角函数回忆:三角恒等式、三角曲线、三角形的边角关系
  3. was部署项目启动显示[jcc][t4][10275][10041][3.63.123]ccsid 编码或语言环境不受支持:“Cp1386”. errorcode=-4220 sqlstate=220
  4. MVDR最小方差无畸形相应波束形成器 Python 实现
  5. 小学教师计算机个人研修计划,小学教师信息技术个人研修计划书
  6. IDEA启动My Eclipse项目
  7. android 各版本介绍,Android的版本的介绍
  8. 网易2019:矩形重叠
  9. 关于SimpleDateFormat日期格式与字符串、时间戳之间的转换
  10. 举个例子解释下什么是线程不安全?