rua

package module
v0.4.2 Latest Latest
Warning

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

Go to latest
Published: Sep 12, 2021 License: MIT Imports: 6 Imported by: 7

README

Rua!

GitHub go.mod Go version GitHub GitHub release (latest by date)

English README

一个高度可定制化、扩展性强的游戏服务器框架,基于Go语言编写。

architecture

特性

安装

安装服务器本体

go get github.com/DiscreteTom/rua

安装插件(以websocket为例)

go get github.com/DiscreteTom/rua/plugin/network/websocket

入门

运行此示例代码需要安装websocket插件

package main

import (
	"github.com/DiscreteTom/rua"
	"github.com/DiscreteTom/rua/plugin/network/websocket"
)

func main() {
	s := rua.NewEventDrivenServer()

	s.OnPeerMsg(func(msg *rua.PeerMsg) {
		// broadcast to everyone
		s.ForEachPeer(func(id int, peer rua.Peer) {
			peer.Write(result)
		})
	}

	// start websocket listener, which will generate peer to the game server
	go websocket.NewWebsocketListener(":8080", s).Start()

	// start event driven game server
	s.Start()
}

更多示例

日志

  • rua自身提供了默认的logger,可以使用rua.DefaultLogger()来获取它,或者使用rua.SetDefaultLogger来覆盖它
    • 比如使用rua.SetDefaultLogger(rua.NewDefaultLogger().WithLevel(rua.DEBUG))来设置日志等级
  • 您也可以使用您喜欢的logger,比如使用logrus,只要它实现了rua.Logger接口
    • rua.SetDefaultLogger(logrus.New())
  • 您也可以使用rua.NewBasicLoggerrua.NewBasicSimpleLogger这两个helper函数,快速构建自定义的logger

更新日志

English

Rua is a highly customizable & scalable game server framework written with golang.

architecture

Features

Installation

Install the rua server itself:

go get github.com/DiscreteTom/rua

Install plugins (e.g. websocket):

go get github.com/DiscreteTom/rua/plugin/network/websocket

Getting Started

This example requires the websocket plugin.

package main

import (
	"github.com/DiscreteTom/rua"
	"github.com/DiscreteTom/rua/plugin/network/websocket"
)

func main() {
	s := rua.NewEventDrivenServer()

	s.OnPeerMsg(func(msg *rua.PeerMsg) {
		// broadcast to everyone
		s.ForEachPeer(func(id int, peer rua.Peer) {
			peer.Write(result)
		})
	}

	// start websocket listener, which will generate peer to the game server
	go websocket.NewWebsocketListener(":8080", s).Start()

	// start event driven game server
	s.Start()
}

More Examples

Logging

  • Rua provide a default logger, you can use rua.DefaultLogger to get it, or use rua.SetDefaultLogger to override it.
    • E.g. you can use rua.SetDefaultLogger(rua.NewDefaultLogger().WithLevel(rua.DEBUG)) to set log level.
  • You can also use your favorite logger like logrus as long as it implements the interface rua.Logger.
    • rua.SetDefaultLogger(logrus.New())
  • You can use these two helper function rua.NewBasicLogger & rua.NewBasicSimpleLogger to build your own logger quickly.

Change Log

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewBasicLogger

func NewBasicLogger(l SimpleLogger) *basicLogger

func NewBasicSimpleLogger

func NewBasicSimpleLogger(l SmallestLogger) *basicSimpleLogger

func NewDefaultLogger

func NewDefaultLogger() *basicLogger

func SetDefaultLogger

func SetDefaultLogger(logger Logger)

Types

type EventDrivenServer

type EventDrivenServer struct {
	// contains filtered or unexported fields
}

func NewEventDrivenServer

func NewEventDrivenServer() *EventDrivenServer

func (*EventDrivenServer) AddPeer

func (s *EventDrivenServer) AddPeer(p Peer) int

Activate a peer, allocate a peerId and manage the peer's lifecycle.

func (*EventDrivenServer) AfterAddPeer

func (s *EventDrivenServer) AfterAddPeer(f func(newPeer Peer)) *EventDrivenServer

Register lifecycle hook. At this time the new peer's id has been allocated, the peer is started and `peers` contains the new peer. This hook may be triggered concurrently.

func (*EventDrivenServer) AfterRemovePeer

func (s *EventDrivenServer) AfterRemovePeer(f func(targetId int)) *EventDrivenServer

Register lifecycle hook. The target peer may not exist. If it exists, it must been closed, and been removed from `peers`. This hook may be triggered concurrently.

func (*EventDrivenServer) AppendPeerMsg

func (s *EventDrivenServer) AppendPeerMsg(p Peer, d []byte)

func (*EventDrivenServer) BeforeAddPeer

func (s *EventDrivenServer) BeforeAddPeer(f func(newPeer Peer)) *EventDrivenServer

Register lifecycle hook. At this time the new peer's id has NOT been allocated, the new peer is not started, and `peers` does not contain the new peer. This hook won't be triggered concurrently.

func (*EventDrivenServer) BeforeProcPeerMsg

func (s *EventDrivenServer) BeforeProcPeerMsg(f func(m *PeerMsg)) *EventDrivenServer

Register lifecycle hook. You can modify or enrich the peer message before process it. This hook may be triggered concurrently.

func (*EventDrivenServer) BeforeRemovePeer

func (s *EventDrivenServer) BeforeRemovePeer(f func(targetId int)) *EventDrivenServer

Register lifecycle hook. The target peer may has been closed. The target peer may not exist. This hook may be triggered concurrently.

func (*EventDrivenServer) ForEachPeer added in v0.4.0

func (s *EventDrivenServer) ForEachPeer(f func(id int, peer Peer))

Thread safe. Do NOT AddPeer or RemovePeer in f.

func (*EventDrivenServer) Logger added in v0.4.0

func (s *EventDrivenServer) Logger() Logger

func (*EventDrivenServer) OnPeerMsg

func (s *EventDrivenServer) OnPeerMsg(f func(m *PeerMsg)) *EventDrivenServer

Register lifecycle hook. This hook may be triggered concurrently.

func (*EventDrivenServer) Peer added in v0.4.0

func (s *EventDrivenServer) Peer(id int) (Peer, error)

Retrieve a peer. Return error if peer not exists.

func (*EventDrivenServer) PeerCount added in v0.4.0

func (s *EventDrivenServer) PeerCount() int

func (*EventDrivenServer) RemovePeer

func (s *EventDrivenServer) RemovePeer(peerId int) (err error)

Close the peer and untrack it. Return err if peer not exist.

func (*EventDrivenServer) Start

func (s *EventDrivenServer) Start() (errs []error)

Return errors from peer.Close() when stop the server.

func (*EventDrivenServer) Stop

func (s *EventDrivenServer) Stop()

func (*EventDrivenServer) WithLogger

func (s *EventDrivenServer) WithLogger(l Logger) *EventDrivenServer

func (*EventDrivenServer) WithName added in v0.4.0

func (s *EventDrivenServer) WithName(n string) *EventDrivenServer

type GameServer

type GameServer interface {
	AddPeer(Peer) int
	RemovePeer(peerId int) error
	AppendPeerMsg(p Peer, d []byte)
}

type LockstepServer

type LockstepServer struct {
	*EventDrivenServer
	// contains filtered or unexported fields
}

func NewLockstepServer added in v0.3.0

func NewLockstepServer() *LockstepServer

func (*LockstepServer) AppendPeerMsg

func (s *LockstepServer) AppendPeerMsg(p Peer, d []byte)

func (*LockstepServer) CurrentStep added in v0.4.0

func (s *LockstepServer) CurrentStep() int

func (*LockstepServer) CurrentStepLength added in v0.4.0

func (s *LockstepServer) CurrentStepLength() int

func (*LockstepServer) OnStep

func (s *LockstepServer) OnStep(f func(peerMsgs []PeerMsg)) *LockstepServer

Register lifecycle hook. This hook may be triggered concurrently.

func (*LockstepServer) Start

func (s *LockstepServer) Start() (errs []error)

Return errors from peer.Close() when stop the server.

func (*LockstepServer) Stop

func (s *LockstepServer) Stop()

func (*LockstepServer) WithMaxStepLength added in v0.4.0

func (s *LockstepServer) WithMaxStepLength(maxStepLength int) *LockstepServer

Set the max step length and ensure the current step length is valid.

func (*LockstepServer) WithMinStepLength added in v0.4.0

func (s *LockstepServer) WithMinStepLength(minStepLength int) *LockstepServer

Set the min step length and ensure the current step length is valid.

func (*LockstepServer) WithStepLength added in v0.4.0

func (s *LockstepServer) WithStepLength(stepLength int) *LockstepServer

Set the current step length. The step length won't be higher than `maxStepLength` and lower than `minStepLength`.

type LogLevel

type LogLevel int
const (
	TRACE LogLevel = iota
	DEBUG
	INFO
	WARN
	ERROR
	FATAL
	PANIC
)

type Logger

type Logger interface {
	Trace(v ...interface{})
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Fatal(v ...interface{})
	Panic(v ...interface{})
	Tracef(format string, v ...interface{})
	Debugf(format string, v ...interface{})
	Infof(format string, v ...interface{})
	Warnf(format string, v ...interface{})
	Errorf(format string, v ...interface{})
	Fatalf(format string, v ...interface{})
	Panicf(format string, v ...interface{})
}

You can use `NewBasicLogger` to create a Logger.

func DefaultLogger added in v0.4.0

func DefaultLogger() Logger

Get the existing or create a new default logger.

type Peer

type Peer interface {
	Write([]byte) error
	Close() error
	Start() // start and wait
	SetId(int)
	Id() int
	SetTag(string)
	Tag() string
}

type PeerMsg

type PeerMsg struct {
	Peer Peer
	Data []byte
	Time time.Time
}

type SimpleLogger

type SimpleLogger interface {
	Trace(v ...interface{})
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Fatal(v ...interface{})
	Panic(v ...interface{})
}

You can use `NewBasicSimpleLogger` to create a SimpleLogger.

type SmallestLogger

type SmallestLogger interface {
	Print(v ...interface{})
}

Directories

Path Synopsis
example
plugin
network/kcp Module

Jump to

Keyboard shortcuts

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