网络游戏登录设计

我目前正在开发一款在线游戏,但我的login server. 每个玩家只能从一个客户端登录,如果他尝试打开另一个客户端并尝试登录,它应该告诉该帐户已经从另一个客户端登录。


这是可行的,但问题是当有人试图在两个客户端同时登录时从 2 个客户端登录,导致帐户在 2 个不同的地方登录。这是我不想要的。


我目前的方法是(我使用的是 GoLang):


var onLogin map[string]uint16 = make(map[string]uint16)


func login(data []byte) []byte {

    username := cstring(data[8:23])

    password := cstring(data[24:39])


    // check if already trying to login

    _, loggingIn := onLogin[username]

    if loggingIn {

        fmt.Println("Possible double connect attempt", username)

        return nil

    }


    (...check if correct login info...)

    (...check if user is already logged in...)


    // remove from list before returning

    delete(onLogin, username)


    (...build and send back packet to client if login success or fail...)

它有帮助(一点点)但是当有人能够在不人道的同时按下 2 个客户端上的登录按钮时,它仍然会通过。也许我的设计有缺陷?有什么建议吗?干杯!


慕莱坞森
浏览 143回答 1
1回答

慕哥6287543

你onLogin需要一个互斥锁,如果你用-race它运行你的代码会告诉你有一场比赛。Race Detector是必读的。// 编辑示例:var onLogin = struct {    sync.Mutex    m map[string]bool}{m: map[string]bool{}}func login(data []byte) []byte {    username := cstring(data[8:23])    password := cstring(data[24:39])    onLogin.Lock()    defer onLogin.Unlock()    if _, loggingIn := onLogin.m[username]; loggingIn {        fmt.Println("Possible double connect attempt", username)        return nil    }    ///....}
打开App,查看更多内容
随时随地看视频慕课网APP