原文地址:http://www.byteedu.com/forum.php?mod=viewthread&tid=565&page=1&extra=#pid799
一. 如何查找協(xié)議
Login_DT_http.go:
package main
import (
_ "LollipopGo/LollipopGo/player"
"Proto"
"Proto/Proto2"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"net/rpc/jsonrpc"
"strconv"
)
/*
登錄服務(wù)器:
http://127.0.0.1:8891/GolangLtdDT?Protocol=8&Protocol2=1
47.107.125.75 == run.babaliuliu.com
*/
func IndexHandler(w http.ResponseWriter, req *http.Request) {
if req.Method == "GET" {
w.Header().Set("Access-Control-Allow-Origin", "*")
req.ParseForm()
defer func() { // 必須要先聲明defer电禀,否則不能捕獲到panic異常
if err := recover(); err != nil {
fmt.Println("%s", err)
req.Body.Close()
}
}()
Protocol, bProtocol := req.Form["Protocol"]
Protocol2, bProtocol2 := req.Form["Protocol2"]
if bProtocol && bProtocol2 {
// 主協(xié)議判斷
if Protocol[0] == strconv.Itoa(Proto.G_GameLogin_Proto) {
// 子協(xié)議判斷
switch Protocol2[0] {
case strconv.Itoa(Proto2.C2GL_GameLoginProto2):
// DB server 獲取 驗證信息 rpc 操作
//------------------------------------------------------
// 暫時不解析用戶名和密碼 --> 后面獨立出來再增加<夥伞5暄拧!
data := DB_rpc_()
b, _ := json.Marshal(data)
fmt.Fprint(w, base64.StdEncoding.EncodeToString(b))
//------------------------------------------------------
return
default:
fmt.Fprintln(w, "88902")
return
}
}
fmt.Fprintln(w, "88904")
return
}
// 服務(wù)器獲取通信方式錯誤 --> 8890 + 1
fmt.Fprintln(w, "88901")
return
}
}
// jsonrpc 數(shù)據(jù)處理
func DB_rpc_() interface{} {
// 鏈接DB操作
client, err := jsonrpc.Dial("tcp", service)
if err != nil {
fmt.Println("dial error:", err)
}
args := Args{1, 2}
var reply Proto2.GL2C_GameLogin
// 同步調(diào)用
// err = client.Call("Arith.Muliply", args, &reply)
// if err != nil {
// fmt.Println("Arith.Muliply call error:", err)
// }
// 異步調(diào)用
divCall := client.Go("Arith.Muliply", args, &reply, nil)
replyCall := <-divCall.Done // will be equal to divCall
fmt.Println(replyCall.Reply)
// 返回的數(shù)據(jù)
fmt.Println("the arith.mutiply is :", reply)
return reply
}
協(xié)議字段:
package Proto2
import (
"LollipopGo/LollipopGo/conf"
"LollipopGo/LollipopGo/player"
)
// G_GameLogin_Proto 的子協(xié)議
// 屬于HTTP 與 DBserver 進行通信
// 獲取到登錄正確的信息后亥揖,token 返回給網(wǎng)關(guān)server
const (
INIT_GameLogin = iota
C2GL_GameLoginProto2 // C2GL_GameLoginProto2 == 1 client -->登錄請求
GL2C_GameLoginProto2 // GL2C_GameLoginProto2 == 2 返回數(shù)據(jù)
)
//------------------------------------------------------------------------------
// C2GL_GameLoginProto2
// 客戶端請求協(xié)議
type C2GL_GameLogin struct {
Protocol int // 主協(xié)議
Protocol2 int // 子協(xié)議
LoginName string // 登錄名字
LoginPW string // 登錄密碼
Timestamp int // 時間戳
}
// GL2C_GameLoginProto2
// 登錄服務(wù)器返回給客戶端協(xié)議
type GL2C_GameLogin struct {
Protocol int // 主協(xié)議
Protocol2 int // 子協(xié)議
Tocken string // server 驗證加密數(shù)據(jù)
PlayerST *player.PlayerSt // 玩家的結(jié)構(gòu)
GateWayST *player.GateWayList // 大廳鏈接地址
GameList map[string]*conf.GameList // 游戲列表
GameListNew map[string]*conf.GameListNew // 游戲列表New
BannerList map[string]*conf.Banner // 廣告列表
}
//------------------------------------------------------------------------------
同學們這下知道了怎么查找協(xié)議了吧费变!下節(jié)課我們就開始實際編碼了