客户端与服务器端之间传输的数据格式有很多种如Json、XML、thrift、Protobuf等等。protobuf来自谷歌,它的特点是数据小、编解码性能高、支持多种语言,它序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一。更加详细请阅读下面2篇文章:
【Google Protobuf】windows下protobuf的环境搭建(一)
【Google Protobuf】protobuf的使用(二)
一、游戏登陆界面
一个简单的登陆UI,关于Unity的UI操作这里就不说了,主要讲C#与Netty如何使用protobuf数据传输。
1.1 代码修改
package Packets; option java_package = "com.game.lll.protobuf"; option java_outer_classname = "LCPacket"; message Login { optional string username = 1; optional string password = 2; }
终端命令: +---------------------------Java---------------------------------------+ D:\ServerWork\MyGame\protobuf>protoc.exe --java_out=./ LCPacket.proto +------------------------------------------------------------------+ +---------------------------C#---------------------------------------+ D:\Game Server\Protobuf\ProtoGen>protogen -LCPacket.proto -o:LCPacket.cs -ns:Packets +------------------------------------------------------------------+
- 使用Netty提供的ProtobufVarint32LengthFieldPrepender,可以处理半包消息
- 继承Netty提供的通用半包解码器LengthFieldBasedFrameDecoder
- 继承ByteToMessageDecoder类,自己处理半包消息
ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());
ch.pipeline().addLast(new ProtobufDecoder(LCPacket.Login.getDefaultInstance()));
ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
ch.pipeline().addLast(new ProtobufEncoder());
using UnityEngine;
using System.Collections;
using Util;
using UnityEngine.UI;
using Packets;
public class LoginView : SingletonMonoBehaviour<LoginView>
{
[SerializeField]
private UIInput txtName;
[SerializeField]
private UIInput txtPwd;
[SerializeField]
private UILabel txtTip;
void Start ()
{
}
public void OnClickLoginBtn()
{
Login login = new Login();
login.username = txtName.text;
login.password = txtPwd.text;
LoginModel.Instance.TocLogin (login);
Debug.Log(login.username);
Debug.Log(login.password);
}
}
using UnityEngine;
using System.Collections;
using ServerMessage;
using Packets;
public class LoginModel : BaseModel<LoginModel>
{
protected override void InitAddTocHandler()
{
AddTocHandler(typeof(Login), TocLogin);
}
public void TocLogin(object data)
{
SendTos(data);
}
}