今回目- 网络通信
网络游戏自然离不开网络通信,这也作为Leaf的一个重要组成部分和消息通信机制紧密结合在一起。
首先要说的是,Leaf的通信地址和端口都配置在服务器工程的bin/conf/server.json 文件中
类似如下:
{
"LogLevel": "debug",
"LogPath": "",
"TCPAddr": "127.0.0.1:3563",
"WSAddr": "127.0.0.1:3653",
"MaxConnNum": 20000
}
这里配置了TCP和WebSocket的通信地址,均为“127.0.0.1:3563”,其他的不用废话大家也能看得懂。
这里有一个好处,就是不管客户端用标准Socket TCP的连接方式还是WebSocket的连接方式,服务端的代码是一样的,不需要因为通信方式的改变而修改代码,这里当然是因为Leaf给封装好了,所以客户端随便得瑟。
剩下的就是客户端和服务器消息的接/发,这里找个最简单的逻辑,举个。
-
服务器:
跟一个简单消息有关的代码文件
1.1 msg.go文件中添加一个消息结构
func handleSignIn(args []interface{}) {
content := args[0].(*msg.SignIn)
requestor := args[1].(gate.Agent)
// 输出收到的消息的内容
log.Debug("Msg SignIn %v", content.Username)
log.Debug("Msg SignIn %v", content.Password)
requestor.WriteMsg(&msg.Hello{
Name: "iron man",
})
}
1.2 并在init()方法中注册这个消息。
func init() {
handler(&msg.SignIn{}, handleSignIn)
}
1.3 在router.go文件的init()方法中,指定刚才注册的消息要被哪个模块接收处理。
func init() {
msg.Processor.SetRouter(&msg.SignIn{}, game.ChanRPC)
}
注意:模块间使用的是ChanRPC通讯
最后, 在指定模块下的handler.go文件进行消息逻辑的处理。
1.4 实现处理函数
func handleSignIn(args []interface{}) {
content := args[0].(*msg.SignIn)
requestor := args[1].(gate.Agent)
// 输出收到的消息的内容
log.Debug("Msg SignIn %v", content.Username)
log.Debug("Msg SignIn %v", content.Password)
requestor.WriteMsg(&msg.Hello{
Name: "iron man",
})
}
1.5 init中注册处理函数
func init() {
handler(&msg.SignIn{}, handleSignIn)
}
- 客户端
这里客户端用的是Cocos Creator 1.9.1版本, JS脚本开发, websocket连接
不用废话,直接上代码,非常好理解。
// 用户登录
signIn: function (event, customEventData) {
cc.log("func: signIn")
var username = this.usernameEditbox.string;
var password = this.passwordEditbox.string;
cc.log("username = " + username);
cc.log("password = " + password);
var ws = new WebSocket("ws://127.0.0.1:3653");
ws.onopen = function (event) {
ws.send(JSON.stringify({SignIn: {
Username: username,
Password: password
}}))
};
ws.onmessage = function (event) {
if(typeof(event.data)=="string") //服务器传过来的可能是字符串,判断是不是
{
cc.log("typeof(event.data)");
}
else
{
console.log("response text msg: " + event.data);
var buffer = event.data;
var msgS = String.fromCharCode.apply(null, new Uint8Array(buffer));
var msgJ = JSON.parse(msgS);
// {"Hello":{"Name":"iron man"}}
console.log("5555 = " + msgJ.Hello.Name); //iron man
}
};
ws.onerror = function (event) {
console.log("Send Text fired an error");
};
ws.onclose = function (event) {
console.log("WebSocket instance closed.");
};
setTimeout(function () {
if (ws.readyState === WebSocket.OPEN) {
ws.send("Hello WebSocket, I'm a text message.");
}
else {
console.log("WebSocket instance wasn't ready...");
}
}, 3);
},
--- To Be Continued ---
【喜欢的点个赞,用得上的打个赏,拿钱去买猫粮。楼下的流浪猫在等我。】