go开发游戏开服程序

Posted luoguo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go开发游戏开服程序相关的知识,希望对你有一定的参考价值。

用go实现自动开服

1.创建游戏库,日志库

2.导入表

3.创建游戏程序

4.修改配置文件

package main

import (
    "bytes"
    "flag"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
    "io/ioutil"
    "os"
    "os/exec"
    "strconv"
    "strings"
)

//执行windows命令
func runInWindows(cmd string) (string, error) {
    result, err := exec.Command("cmd", "/c", cmd).Output()
    if err != nil {
        return "", err
    }
    return strings.TrimSpace(string(result)), err
}

//数据库连接
var GameDB *sqlx.DB    //game库连接
var GameLogDB *sqlx.DB //log库连接
//game库连接方式
func init() {
    database, err := sqlx.Open("mysql", "gameuser:xxxx@tcp(10.41.3.138:3306)/")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }
    GameDB = database
    defer GameDB.Close() // 注意这行代码要写在上面err判断的下面
}

//log库连接方式
func init() {
    database, err := sqlx.Open("mysql", "gameuser:xxx@tcp(10.41.3.138:3306)/")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }
    GameLogDB = database
    defer GameLogDB.Close() // 注意这行代码要写在上面err判断的下面
}

//数据库创建授权
func createDb(plat string, zone int) {
    db, err := sqlx.Open("mysql", "gameuser:xxxx@tcp(10.41.3.138:3306)/")
    if err != nil {
        fmt.Println("数据库连接错误", err)
    }
    gamedb := fmt.Sprintf("game_sczz_%s_%s", plat, strconv.Itoa(zone))
    gamelogdb := fmt.Sprintf("gamelog_sczz_%s_%s", plat, strconv.Itoa(zone))
    _, dberr := db.Exec("CREATE DATABASE " + gamedb + " charset utf8 COLLATE utf8_general_ci")
    if dberr != nil {
        fmt.Println("游戏数据库创建错误???-->", gamedb, dberr)
        return
    } else {
        fmt.Println("游戏数据库创建成功!!!-->", gamedb)
    }
    _, dblogerr := db.Exec("CREATE DATABASE " + gamelogdb + " charset utf8 COLLATE utf8_general_ci")
    if dblogerr != nil {
        fmt.Println("日志数据库创建错误???-->", gamelogdb, dblogerr)
        return
    } else {
        fmt.Println("日志数据库创建成功!!!-->", gamelogdb)
    }
}

//数据库导入
func createTable(plat string, zone int) {
    gamedb := fmt.Sprintf("game_sczz_%s_%s", plat, strconv.Itoa(zone))
    gamelogdb := fmt.Sprintf("gamelog_sczz_%s_%s", plat, strconv.Itoa(zone))
    gamesqlcmd := fmt.Sprintf("mysql -h 10.41.3.138 -ugameuser  -pxxx   %s < gamedb.sql", (gamedb))         //gamesql导入命令
    gamelogsqlcmd := fmt.Sprintf("mysql -h  10.41.3.138  -ugameuser -pxxx %s < gamelogdb.sql", (gamelogdb)) //gamelog导入命令
    fmt.Println("分别执行的导入命令", gamesqlcmd, gamelogsqlcmd)
    gamesqlresult, gamesqlerr := runInWindows(gamesqlcmd)
    if gamesqlerr != nil {
        fmt.Println("gamesql导入失败???", gamesqlerr)
    } else {
        fmt.Println("gamesql导入成功!!!")
    }
    fmt.Println(gamesqlresult)
    gamelogsqlresult, gamelogsqlerr := runInWindows(gamelogsqlcmd)
    if gamelogsqlerr != nil {
        fmt.Println("gamelogsql 导入失败???", gamelogsqlerr)
    } else {
        fmt.Println("gamelogsql导入成功!!!")
    }
    fmt.Println(gamelogsqlresult)

}

//设定game程序
func configGame(plat string, zone int) {
    path := fmt.Sprintf("game\\\\sczz_%s_%s /E /X /O /K /H /I >nul", plat, strconv.Itoa(zone))
    fmt.Println("path is ", path)
    //server重命名sczz_maowang_1
    gamecmd := fmt.Sprintf("xcopy  server %s ", path) //设定新的目录名称
    fmt.Println("game xcopy command is ", gamecmd)
    gameresult, err := runInWindows(gamecmd)
    if err != nil {
        fmt.Println("game程序设定错误???")

    } else {
        fmt.Println("game程序设定成功!!!")
    }
    fmt.Println(gameresult)

}

//设定接口程序
func configInterface(plat string, zone int) {
    webdir := fmt.Sprintf("web\\\\web_sczz_%s", plat)
    _, err := os.Stat(webdir)
    if err != nil {
        os.Mkdir(webdir, 0766)
    }
    path := fmt.Sprintf("web\\\\web_sczz_%s\\\\s%s /E /X /O /K /H /I >nul", plat, strconv.Itoa(zone))
    fmt.Println("interface path is ...", path)
    interfacecmd := fmt.Sprintf("xcopy interface %s", path) //设定新的目录名称
    fmt.Println("interfacecmd is ....", interfacecmd)
    interfaceresult, err := runInWindows(interfacecmd)
    if err != nil {
        fmt.Println("interfacecmd程序设定错误???")

    } else {
        fmt.Println("game程序设定成功!!!")
    }
    fmt.Println(interfaceresult)

}

//判断搭建区服是否存在
func IsDir(plat string, zone int) bool {
    //判断区服是否存在
    path := fmt.Sprintf("game/sczz_%s_%s", plat, strconv.Itoa(zone))
    _, err := os.Stat(path)
    if err != nil {
        fmt.Println("游戏还么有创建,开始搭建区服!!!")
        return false
    }
    return true
}

//修改配置文件端口号
func modifyPort(plat string, zone int) {
    initport := 4000
    rpcport := initport + zone
    gamedb := fmt.Sprintf("game_sczz_%s_%s", plat, strconv.Itoa(zone))
    gamelogdb := fmt.Sprintf("gamelog_sczz_%s_ %s", plat, strconv.Itoa(zone))
    configFile := fmt.Sprintf("web\\\\web_sczz_%s\\\\s%s\\\\Web.config", plat, strconv.Itoa(zone))
    fmt.Println(rpcport, gamedb, gamelogdb, configFile)
    xmlParam, err := ioutil.ReadFile(configFile)
    if err != nil {
        fmt.Println("文件读取失败!!!")
        return
    }
    if !bytes.Contains(xmlParam, []byte("4001")) {
        fmt.Println("4001不存在,替换失败!!!")
        return
    }
    if !bytes.Contains(xmlParam, []byte("game_sczz_maowang_1")) {
        fmt.Println("game_sczz_maowang_1不存在,替换失败!!!")
        return
    }
    if !bytes.Contains(xmlParam, []byte("gamelog_sczz_maowang_1")) {
        fmt.Println("gamelog_sczz_maowang_1不存在,替换失败!!!")
        return
    }

    xmlParam = bytes.ReplaceAll(xmlParam, []byte("4001"), []byte(strconv.Itoa(rpcport)))
    ioutil.WriteFile(configFile, xmlParam, os.ModePerm)

}

//修改配置文件gamedb
func modifyGamedb(plat string, zone int) {
    gamedb := fmt.Sprintf("game_sczz_%s_%s", plat, strconv.Itoa(zone))
    configFile := fmt.Sprintf("web\\\\web_sczz_%s\\\\s%s\\\\Web.config", plat, strconv.Itoa(zone))
    xmlParam2, err := ioutil.ReadFile(configFile)
    if err != nil {
        fmt.Println("文件读取失败!!!")
        return
    }

    if !bytes.Contains(xmlParam2, []byte("game_sczz_maowang_1")) {
        fmt.Println("game_sczz_maowang_1不存在,替换失败!!!")
        return
    }
    xmlParam2 = bytes.ReplaceAll(xmlParam2, []byte("game_sczz_maowang_1"), []byte(gamedb))
    ioutil.WriteFile(configFile, xmlParam2, os.ModePerm)
}

//修改gamelogdb
func modifyGameLogdb(plat string, zone int) {
    gamelogdb := fmt.Sprintf("gamelog_sczz_%s_%s", plat, strconv.Itoa(zone))
    configFile := fmt.Sprintf("web\\\\web_sczz_%s\\\\s%s\\\\Web.config", plat, strconv.Itoa(zone))
    xmlParam3, err := ioutil.ReadFile(configFile)
    if err != nil {
        fmt.Println("gamelog文件读取失败!!!")
        return
    }
    if !bytes.Contains(xmlParam3, []byte("gamelog_sczz_maowang_1")) {
        fmt.Println("gamelog_sczz_maowang_1不存在,替换失败!!!")
        return
    }
    xmlParam3 = bytes.ReplaceAll(xmlParam3, []byte("gamelog_sczz_maowang_1"), []byte(gamelogdb))
    ioutil.WriteFile(configFile, xmlParam3, os.ModePerm)
}
func main() {
    var plat string
    var zone int
    flag.StringVar(&plat, "a", "maowang", "平台")
    flag.IntVar(&zone, "z", 1000, "区服")
    flag.Parse()
    if flag.NFlag() < 2 {
        fmt.Println("参数使用错误")
        return
    }
    fmt.Println("你输入的信息是:")
    fmt.Println("平台: ", plat)
    fmt.Println("区服: ", zone)
    var commit string
    fmt.Println("请输入确认信息yes,代表确认无误可以往下执行!!!")
    fmt.Scan(&commit)
    if commit != "yes" {
        return
    }
    //判断此区服是否搭建
    if IsDir(plat, zone) {
        fmt.Println("区服已经创建过了,不需创建,退出!!!")
        return
    }
    //创建数据库
    createDb(plat, zone)
    //创建表和存储过程
    createTable(plat, zone)
    //设定game程序
    configGame(plat, zone)
    //设定网关程序
    configInterface(plat, zone)
    //modifyConfig(plat, zone)
    //修改配置文件选项
    fmt.Println("开始修改配置文件:")
    modifyPort(plat, zone)
    modifyGamedb(plat, zone)
    modifyGameLogdb(plat, zone)

}

以上是关于go开发游戏开服程序的主要内容,如果未能解决你的问题,请参考以下文章

手游开服一天被黑客攻击,官方直接停服,将游戏改为单机版!

游戏运维平台

搭建传奇游戏,都需要准备什么东西。

微信小程序代码片段

开服应该如何选择服务器

游戏开发实战用Go语言写一个服务器,实现与Unity客户端通信(Golang | Unity | Socket | 通信 | 教程 | 附工程源码)