server/

directory
v0.0.0-...-f1dee3b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 9, 2019 License: MIT

README

GOWOG Server

Summary

Golang based multipler game server. Following Golang concurrency model, the game can tollerate high concurrency throughput.

Background

Not like webserver when the each requests don't share the state and can have some latency acceptance point. Game server involves modifying sharing memory state to achieve smooth performance.

Golang provides a very elegant solution to solve high concurrency problem by goroutine and channel while still maintaining good running performance.

  • Share memory by communication

Installation

In Main page

This will run web server in the terminal, which listens to port 8080

Development

Components

There are mainly 5 entities in the game. Their states are private

Entity Private State Description
Client websocket.Conn client holds websocket connection.
Hub Client Hub handles all communication, containing list of all clients.
ObjManager Player, Shoot, ... ObjManager contains all Player and Shoot, process game logic.
Game Master ObjManager, Hub Master object consists of ObjManager and Hub.
Architecture

Architecture

Different entities call each other through channel which is wrapped in a function. Golang prevents cycle package dependency, so if a child want to call parent function, parent needs to expose method to child package. For example, IGame interface in Hub package to allow Hub call Game method.

Client Server sample interaction

Client here is webpage, Server is main backend.

Player connect

PlayerConnect

Player Disconnect

PlayerDisconnect

Client input

ClientInput

Profile

Profile is the way to investigate Golang performance and figure out the slow components. You can profile the server with flag --cpuprofile, and --memprofile when running server.

go run cmd/server --cpuprofile --memprofile

Loadtest will be added soon.

Code structure
├── server
│   ├── cmd
│   │   └── server
│   │       └── server.go: Entrypoint running server
│   ├── game
│   │   ├── common
│   │   ├── config
│   │   │   └── 1.map: Map represented 0 and 1
│   │   ├── gameconst
│   │   ├── game.go: Game master objects, containing logic and communication
│   │   ├── mappkg
│   │   ├── objmanager
│   │   ├── playerpkg
│   │   ├── shape
│   │   ├── shootpkg
│   │   ├── types.go
│   │   └── ws
│   │       ├── wsclient.go
│   │       └── wshub.go
│   ├── generate.sh: Generate protobuf for server + client + AI environment
│   ├── message.proto
│   └── Message_proto
│       └── message.pb.go
├── Dockerfile
└── run_local.sh

Credits

The server websocket design is based on Gorila websocket chat example. https://github.com/gorilla/websocke/blob/master/examples/chat

Directories

Path Synopsis
cmd
config
package config.
package config.
shape
package shape is to define shape interface of game object to handle object collision proper
package shape is to define shape interface of game object to handle object collision proper
ws

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL