Code Monkey home page Code Monkey logo

tank-game-server's Introduction

简体中文 | English

Note:unity客户端用的2019的版本,因为协议和服务器对不上,已经停止维护

Ⅰ. 进击的坦克(The Fight of Tanks)

  • zfoo框架的游戏服务器的演示项目
  • 单服运行代码和分布式运行的代码几乎一致
  • 上能写游戏,下能写网站,单服,分布式,网关,异步调用无所不能,所以叫万能的RPC框架

Ⅱ. 环境要求

  • 后端依赖 zfoo ,运行前先使用Maven install zfoo 前端依赖 lux-admin-vuetify3,目标创造最优秀的 vuetify3 的 Admin 开源模板
  • JDK 17+
  • MongoDB 4+
  • Zookeeper 3.6+

Ⅲ. 本地单服运行

  • admin为web资源服务器提供游戏入口和后台管理系统
  • single为单服游戏服务器,single-boot是用了spring boot自动化配置的single,代码一致
  • 单服启动不依赖zookeeper,所以无法和admin通信
  • 本地运行从test下运行,原因看FAQ ,实在有问题可以看看手把手的 zfoo 框架视频教程

unity客户端已经停止维护,目前只能用java客户端去测试协议

1. 在浏览器中运行游戏使用websocket的服务器启动入口,即ApplicationTest.startWebsocketApplication()
2. 在untiy种运行使用tcp的服务器启动入口,即ApplicationTest.startApplication()

本地游戏测试入口,https://github.com/zfoo-project/tank-game-server/blob/main/single-boot/src/test/java/com/zfoo/tank/single/boot/client/MyTankClientTest.java
本地游戏入口,http://localhost:9600/game/index.html ,老版本unity无法下载已经弃用,现已弃用
本地后台管理入口,http://localhost:9600/

Ⅳ. 本地分布式运行

  • admin为web资源服务器提供游戏入口和后台管理系统
  • gateway网关
  • cache提供缓存服务
  • home提供基本业务逻辑服务
  • login提供http登录服务
  • 本地运行从test下运行,原因看FAQ ,实在有问题可以看看手把手的 zfoo 框架视频教程
本地游戏测试入口,https://github.com/zfoo-project/tank-game-server/blob/main/single-boot/src/test/java/com/zfoo/tank/single/boot/client/MyTankClientTest.java
本地游戏入口,http://localhost:9600/game/index.html ,老版本unity无法下载已经弃用,现已弃用
本地后台入口,http://localhost:9600/

Ⅴ. 部署运行

单服部署命令:
sh /deploy.sh stopUpdateStart /usr/local/tank/admin/admin-1.0.jar /usr/local/tank/admin
sh /deploy.sh stopUpdateStart /usr/local/tank/single/single-1.0.jar /usr/local/tank/single


分布式部署命令
sh /deploy.sh stopUpdateStart /usr/local/tank/admin/admin-1.0.jar /usr/local/tank/admin
sh /deploy.sh stopUpdateStart /usr/local/tank/cache/cache-1.0.jar /usr/local/tank/cache
sh /deploy.sh stopUpdateStart /usr/local/tank/gateway/gateway-1.0.jar /usr/local/tank/gateway
sh /deploy.sh stopUpdateStart /usr/local/tank/home/home-1.0.jar /usr/local/tank/home

Ⅵ. 游戏截图

Image text Image text Image text Image text Image text Image text

Ⅵ. 后台系统截图

Image text Image text Image text Image text Image text Image text

tank-game-server's People

Contributors

132982jianan avatar 37sir avatar godotg avatar meiwei666 avatar qq564139153 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

tank-game-server's Issues

无法启动服务

image
我启动服务只会获取xml配置,然后就阻塞了。你没有这个情况吗?

你好,连接服务器时报错,能否帮忙看下?谢谢!

2021-07-30 22:30:31 [INFO ] [netty-worker-3-2] com.zfoo.net.handler.ServerDispatcherHandler.channelActive(ServerDispatcherHandler.java:39) - server channel [[ip:127.0.0.1:50040][sid:25][uid:null]] is active
2021-07-30 22:30:31 [ERROR] [netty-worker-3-2] com.zfoo.net.handler.BaseDispatcherHandler.exceptionCaught(BaseDispatcherHandler.java:74) - [session[ip:127.0.0.1:50040][sid:25][uid:null]]未知异常
java.lang.ClassCastException: class io.netty.handler.codec.http.HttpObjectAggregator$AggregatedFullHttpRequest cannot be cast to class com.zfoo.net.packet.model.DecodedPacketInfo (io.netty.handler.codec.http.HttpObjectAggregator$AggregatedFullHttpRequest and com.zfoo.net.packet.model.DecodedPacketInfo are in unnamed module of loader 'app')
at com.zfoo.net.handler.BaseDispatcherHandler.channelRead(BaseDispatcherHandler.java:67)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
at io.netty.handler.codec.http.websocketx.Utf8FrameValidator.channelRead(Utf8FrameValidator.java:82)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandshakeHandler.channelRead(WebSocketServerProtocolHandshakeHandler.java:65)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
2021-07-30 22:30:31 [WARN ] [netty-worker-3-2] com.zfoo.net.handler.ServerDispatcherHandler.channelInactive(ServerDispatcherHandler.java:52) - [channel:[ip:127.0.0.1:50040][sid:25][uid:null]] is inactive

启动单服的服务器(浏览器访问),在浏览器中输入:http://localhost:18000/game/index.html,进行访问后会报错。

找不到zfoo的依赖, 我在mvnrepository搜也没有找到

$ mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] common [jar]
[INFO] admin [jar]
[INFO] gateway [jar]
[INFO] home [jar]
[INFO] cache [jar]
[INFO] single [jar]
[INFO] single-boot [jar]
[INFO] tank-game-server [pom]
[INFO]
[INFO] ------------------------< com.zfoo.tank:common >------------------------
[INFO] Building common 1.0 [1/8]
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for com.zfoo:event:jar:3.0 is missing, no dependency information available
[WARNING] The POM for com.zfoo:hotswap:jar:3.0 is missing, no dependency information available
[WARNING] The POM for com.zfoo:net:jar:3.0 is missing, no dependency information available
[WARNING] The POM for com.zfoo:scheduler:jar:3.0 is missing, no dependency information available
[WARNING] The POM for com.zfoo:storage:jar:3.0 is missing, no dependency information available
[WARNING] The POM for com.zfoo:orm:jar:3.0 is missing, no dependency information available
[WARNING] The POM for com.zfoo:util:jar:3.0 is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for tank-game-server 1.0:
[INFO]
[INFO] common ............................................. FAILURE [ 0.164 s]
[INFO] admin .............................................. SKIPPED
[INFO] gateway ............................................ SKIPPED
[INFO] home ............................................... SKIPPED
[INFO] cache .............................................. SKIPPED
[INFO] single ............................................. SKIPPED
[INFO] single-boot ........................................ SKIPPED
[INFO] tank-game-server ................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.296 s
[INFO] Finished at: 2022-08-10T15:52:33+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project common: Could not resolve dependencies for project com.zfoo.tank:common:jar:1.0: The following artifacts could not be resolved: com.zfoo:event:jar:3.0, com.zfoo:hotswap:jar:3.0, com.zfoo:net:jar:3.0, com.zfoo:scheduler:jar:3.0, com.zfoo:storage:jar:3.0, com.zfoo:orm:jar:3.0, com.zfoo:util:jar:3.0: Failure to find com.zfoo:event:jar:3.0 in http://maven.aliyun.com/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of nexus-aliyun has elapsed or updates are forced -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

在项目root目录mvn packge到single-boot报错

JDK 17
报错:
[INFO] single 1.0 ......................................... SUCCESS [ 14.689 s]
[INFO] single-boot 1.0 .................................... FAILURE [ 0.916 s]
[INFO] zfoo-graalvm-asimple 1.0 ........................... SKIPPED
[INFO] zfoo-graalvm-event 1.0 ............................. SKIPPED
[INFO] zfoo-graalvm-storage 1.0 ........................... SKIPPED
[INFO] zfoo-graalvm-scheduler 1.0 ......................... SKIPPED
[INFO] zfoo-graalvm-orm 1.0 ............................... SKIPPED
[INFO] zfoo-graalvm-protocol 1.0 .......................... SKIPPED
[INFO] zfoo-graalvm-net 1.0 ............................... SKIPPED
[INFO] tank-game-server 1.0 ............................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:06 min
[INFO] Finished at: 2024-02-15T13:39:49+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project single-boot: Compilation failure
[ERROR] /Users/xmly/godots/tank-game-server/single-boot/src/main/java/com/zfoo/tank/single/boot/controller/LoginController.java:[131,28] 找不到符号
[ERROR] 符号: 方法 getToken()
[ERROR] 位置: 类型为com.zfoo.tank.common.protocol.login.GetPlayerInfoRequest的变量 request
[ERROR]
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project single-boot: Compilation failure
/Users/xmly/godots/tank-game-server/single-boot/src/main/java/com/zfoo/tank/single/boot/controller/LoginController.java:[131,28] 找不到符号
符号: 方法 getToken()
位置: 类型为com.zfoo.tank.common.protocol.login.GetPlayerInfoRequest的变量 request

at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:333)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:206)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)

Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure
/Users/xmly/godots/tank-game-server/single-boot/src/main/java/com/zfoo/tank/single/boot/controller/LoginController.java:[131,28] 找不到符号
符号: 方法 getToken()
位置: 类型为com.zfoo.tank.common.protocol.login.GetPlayerInfoRequest的变量 request

at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:1212)
at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:193)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:206)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)

[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :single-boot

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.