Code Monkey home page Code Monkey logo

leaf's People

Contributors

heyilin416 avatar huazhihao avatar karllynnn avatar ljfuyuan avatar lonng avatar name5566 avatar pconcepcion avatar zsai001 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  avatar  avatar  avatar  avatar

Watchers

 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  avatar  avatar  avatar  avatar

leaf's Issues

GameModule 接收到用户请求时,怎么验证用户是否已经登陆?

目前想到的是在 rpcNewAgent,rpcCloseAgent 时维护用户 session,然后在每个 message 的 handle 函数开头做判断。
但这样做一个是重复操作,应该有一个统一的地方处理。二个是如果遗漏了,忘记判断,那么没验证的用户请求也能进入GameModule。

群主的群还是要注意一下

在你们群里呆了一段时间,本来是想看看有什么好的建议及**我能吸取下,有什么见解也能听到,但是没想到好多都是带着程序员高傲光环说话,人家反馈了一个现实结果群里就一堆类似小学生的吐槽,建议清理下,本人已经退群!这个东西和pomelo还是挺类似的,pomelo的群非常好,对于同一个问题的反馈有完全不同的反响!你的这个群里面最好也能管理完善一下,不太建议为了人气什么人都加!

消息结构体如何添加其他结构体?

在msg/msg.go中,

const (
S2C_Auth_OK = 0
S2C_Auth_AccIDInvalid = 1
)

type S2C_Auth struct {
Err int
}

在game/internal/userdata.go中,

type UserData struct {
UserID int "_id"
AccID string
}

想让S2C_Auth添加UserData,

type S2C_Auth struct {
Err int
Data UserData
}

该如何处理,还是说消息结构体中只能是string、int、bool、[]string、[]int基本数据类型?

Comment for godoc

Could you comment your code for using in godoc? The documentation would help to work

mongodb auth 问题

gopkg.in/mgo.v2 的 mgo.Session 被封装起来了,而 Login 接口没有开放出来。
该怎么做 auth 呢?

Authentication

Hi. I'm trying to implement authentication into my game server with a username and password. What is the best practice for doing this in Leaf?

(I'm sorry if this is the wrong place to ask. I'm just kinda stuck with doing this in my application.)

msgInfo 命名混淆

type Processor struct {
msgInfo map[string]*MsgInfo
}

type MsgInfo struct {
msgType reflect.Type
msgRouter *chanrpc.Server
msgHandler MsgHandler
msgRawHandler MsgHandler
}
这两个msgInfo 是通过大小写来区分的,容易混淆,上面msgInfo 改成 msgMap 之类比较好。

网络层的优雅关闭和强制关闭

socket 可以通过 LINGER 选项设置关闭时(close 和 shutdown)的行为(http://man7.org/linux/man-pages/man7/socket.7.html ),如果开启了 LINGER 则会尽可能的发送已经进入队列中的消息:

  1. 要么队列中的消息被全部发送完成
  2. 要么 LINGER 超时

在 Leaf 的网络层中,有一个类似的机制,但是和 socket 的行为有一些细微的差别:没有超时机制,在一些情况可能导致无限制的等待队列中的消息被发送。换而言之:

  1. Leaf 网络层连接的 Close 方法不能保证一定释放连接,但是它能保证一定尽可能的发送调用 Close 之前发送的消息(避免消息丢失)
  2. Leaf 网络层连接的 Destroy 方法不能保证调用 Destroy 之前发送的消息一定被发送,但是它能保证连接一定被释放

"read message error: EOF" printed when run sample

| => ./server
2015/09/24 19:25:00 [release] Leaf starting up

2015/09/24 19:25:05 [debug ] read message error: EOF
2015/09/24 19:25:05 [debug ] hello leaf

看了几个golang game server后我觉得leaf最有条理性。首先感谢分享。
我在使用你的leaf server示例代码时,发现每次收包会有 EOF错误(但不影响主逻辑)
我对golang不熟,利用各种方法(包括gdb)弄了半天没搞清楚是哪里错了,原先以为是客户端write后没有close connection,但是close了还是报错,只能麻烦你帮忙解答下了,谢谢。

关于解析器

解析器没有提供一个统一的littleEndian 会造成发送流 和 接收流 编码不一致
你的demo 中指涉及到json的数据格式 如果是二进制的数据格式 就很容易造成问题
也许是因为我对这个框架的认知度不够高 有些设计**上可能没有明白过来

Lock granularity in TCPConn

mutex只为同步一个closeFlag变量,更改为atomic是否会好一点?

defer is function scope, maybe sync.atomic is better for sync.Mutex?

mongodb 实例访问不到

在 login/internal/module.go 中声明了var mongoDB *mongodb.DialContext,并且在 OnInit 中连接成功。但在 login/internal/session.go 中 mongoDB为nil, session.go 的接口是由 hanlder.go 调用的。

module.go 相关代码:

var (
	mongoDB  *mongodb.DialContext
	skeleton = base.NewSkeleton()
	ChanRPC  = skeleton.ChanRPCServer
)

type Module struct {
	*module.Skeleton
}

func (m *Module) OnInit() {
	m.Skeleton = skeleton

	mongoDB, err := mongodb.Dial(conf.Server.DBUrl, 1024)
	if err != nil {
		log.Fatal("dial mongoDB error: %v", err)
		panic(1)
	}
	log.Release("Connected to mongoDB by " + conf.Server.DBUrl)

	err = mongoDB.EnsureUniqueIndex("game", "user", []string{"UserID"})
	if err != nil {
		log.Fatal("ensure index error: %v", err)
		panic(1)
	}
	err = mongoDB.EnsureCounter("game", "counter", "user")
	if err != nil {
		log.Fatal("ensure counter error: %v", err)
		panic(1)
	}
}

session.go 相关代码:

func login(auth *msg.C2S_Auth, agent gate.Agent) (session *Session, err error) {
	userID := auth.UserID
	session = new(Session)
	err = nil
	log.Debug("mongoDB: %+v", mongoDB)
// ...
}

handler.go 相关代码:

func handleAuth(args []interface{}) {
	m := args[0].(*msg.C2S_Auth)
	a := args[1].(gate.Agent)

	log.Debug("hello %v", m.UserID)
	ssn := sessions[m.UserID]
	if ssn != nil {
		// kick
		ssn.logout()
	} else {
		ssn, err := login(m, a)
		if err != nil {
			sessions[ssn.UserID] = ssn
		}
	}
// ...
}

讨论module设计

  • module为啥不用map管理 不需要快速找到模块吗?
  • 为啥不给每个module加一个channel通过这个来做通讯

定时器的功能太少,能否适当跟进增加功能?

首先感谢作者的开源精神!个人在使用leaf过程中提交点小建议。
感觉目前的定时器功能还不够,有个常见的需求不具备,说明如下:
根据指定定时器名称,可设置时间间隔,定时轮训执行某个func(),以此创建定时器触发器。
并提供相关的查询、修改时间间隔、停止、清理等相关接口。
需要注意的是,需要从整体去规划定时器的触发,而不是任意创建一个定时器就等待它自己内部按自己内部的时间触发。例如,创建一个房间,房间会按每秒50次触发房间广播的定时轮询触发器A,如果有100个房间总不能100个定时器吧?应该是100个房间都在定时轮询触发器A内触发吧。
个人拙见,见效勿怪。

怎样正确关闭 gate.Agent?

分别调用 Agent.Close(), Agent.Destroy(),或者一起调用,都会有日志:
[debug ] read message: read tcp 127.0.0.1:9999->127.0.0.1:60990: use of closed network connection

如何实现集群(Cluster)及数据库访问?

1、比如游戏并发访问比较高时,需要部署一个Login及多台Gate和Game模块,如何实现?
不同的用户登录到了不同的服务器,是否可实现广播消息?

2、游戏本身的数据保存到mysql,而不是mongodb, 需要如何扩展?

在 Leaf 中如何加入自己的工具函数

func GetToken(length int) string {
	str := ""
	for i := 0; i < length; i++ {
		str += RandString()
	}

	return str
}

// 生成随机字符
func RandString() string {
	str := [...]string{
		"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c",
		"d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
		"q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C",
		"D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
		"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "~", "!", "@",
		"#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "[",
		"]", "{", "}", "|", "<", ">", "?", "/", ".", ",", ";", ":"}
	rand.Seed(time.Now().UnixNano())
	return str[rand.Int63n(int64(len(str)))]
}

类似于生成随机字符串这样的工具函数,放在哪里会比较好一点,新建一个util目录然后再新建一个util.go?

谁能给一个基于leaf+html5的通讯的例子

说明太少了,按介绍中WebSocket的使用,实现从html5客户端向服务端发送信息,并在服务端debug出信息。可是我想在html5的页面中得到返回来的信息,而不是只是debug在服务端。。应该怎么做呢?请大神帮助。

在 Leaf 中如何检测网络异常的客户端已经断开连接

当使用WebSocket进行通讯时,手动关闭客户端,服务端能够监听到客户端关闭。如何客户端突然网络异常,比如手动关闭网络连接,服务端将收不到客户端的任何请求,这种情况下服务端要如何处理才能知道客户端已经断开连接?

在 Leaf 中使用 Protobuf,客户端如何对接服务器

Wiki文档中并没有提供相关代码,只好硬着头皮自己写

conn, err := net.Dial("tcp", "127.0.0.1:3563")
if err != nil {
	panic(err)
}

hello := &msg.Hello{
	Name: proto.String("leaf"),
}

data, err := proto.Marshal(hello)
if err != nil {
	log.Fatal("marshaling error: ", err)
}

// len + data
m := make([]byte, 2+len(data))

// 默认使用大端序
binary.BigEndian.PutUint16(m, uint16(len(data)))

copy(m[2:], data)

// 发送消息
conn.Write(m)

服务端打印:
2016/12/16 21:04:35 [debug ] unmarshal message error: message id 2564 not registered

不知道该怎么办了

Documentation, what does leaf do?

I've seen this project at awesome-go. Unfortunately it's description doesn't help much about describing itself and it's features.

Does It handle web-sockets? It stores users data? It has an REST API?

I would love to contribute in some way.

Thank you

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.