go基础语法 菜鸟教程 http://www.runoob.com/go/go-tutorial.html
概述一下需求和游戏功能
需求:
1. 接入第三方平台的http请求,数据格式json
2. 可发送多人邮件和全服邮件
3. 多人邮件包括单人邮件,全服邮件包括单服邮件和多服邮件
游戏功能<服务器>:
1. 邮件信息包括:模板id,主题/标题,内容,发送人/署名,类型,附件,收件人,操作途径,离线是否发送
2. 消息流程:第三方请求–>HttpServer—>GameServer
需要留意的几个地方
1. handleSendMail 处理收到的协议包
2. IsHTTPCenter() 如果是中心服务器,则可以向其它HttpServer转发协议包
3. sendMail2GS中CallGameSer向GameServer发送邮件信息包,MailRspPack向HttpServer回包
4. HFWriteRsp 向第三方回包
5. go func() 并行处理向GameServer发包
6. CallGameSer 和 MailRspPack 发包和回包 是顺序执行的 其中MailRspPack 可先挂起等待 直到GameServer返回消息再执行
7. sendGlobalMail2GS全服邮件每隔1s按批次发送邮件,减少服务器同一时间的压力
8. batchSendMail首次向服务器发送邮件时需GameServer创建一个模板id并返回,其它批次发送是需获得这个邮件模板id并把它发给GameServer,并且其它批次不再需要GameServer回包,这样全服邮件就只需创建一个邮件模板即可。batchSendMail返回值依次为:邮件模板id,函数执行结果,数据库查询行索引。只有函数执行成功即发送成功时,下次发送的行索引才可增加。
代码部分
代码中很少有注释,原因:代码的理解不想依赖于注释,想通过好的命名和代码结构让读代码的人也能够理解。有时候过多的注释会降低对代码质量的要求,总想着代码乱点,多写点注释就行了,而不想着如何去精简和优化代码。错误的注释还不如没有注释。只在关键的地方写上注释即可。当然,下面的代码也还有待提高。
body := []byte… 测试用的json数据
package GM
import (
"encoding/json"
"fmt"
"httpserver/logger"
"httpserver/misc/packet"
"httpserver/myDB"
"httpserver/tylnet"
"io/ioutil"
"net/http"
"time"
)
//MailType
const (
MailTypeSingle = 0
MailTypeMulti = 1
MailTypeServer = 2
)
//MailSenderName
const (
MailSenderNameGM = "GM"
MailSenderNameLD = "官方"
)
//MailSenderId
const (
MailSenderIDGM = 1
MailSenderIDLD = 2
)
//MailAttachsMaxNum ..
const MailAttachsMaxNum = 5
//MailPlayerIdsMaxNum ..
const MailPlayerIdsMaxNum = 50
//SendGlobalMailStep ..
const SendGlobalMailStep = 100
//MailAttachXF struct
type MailAttachXF struct {
TypeID int32