【Netty4.X】Unity与Netty使用protoBuf(四)

  客户端与服务器端之间传输的数据格式有很多种如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 代码修改

 
1
  创建LCPacket.proto文件,用于客户端登录向服务器发送账户、密码。
package Packets;
option java_package = "com.game.lll.protobuf";
option java_outer_classname = "LCPacket";

message Login
{
	optional string username = 1;
	optional string password = 2;
}

2
  LCPacket.proto文件分别生成LCPacket.java、LCPacket.cs代码
终端命令:
+---------------------------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
+------------------------------------------------------------------+
3
  将LCPacket.java、LCPacket.cs代码分别拷贝到Java和Unity项目中
4
  在基于netty的项目中使用protobuf,需要处理不同的消息,因此需要不同的编码和解码方式,代码如下。注意的是ProtobufDecoder仅仅负责解码,它不支持读半包。因此,在ProtobufDecoder前面一定要有能够处理读半包的解码器,有以下三种方式可以选择。
  • 使用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());
5
  将玩家输入的账号密码传到服务器
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);
    }

}

   1.2 运行结果

1
  运行客户端,输入登录账户密码

2
  查看服务器端控制台



作者: 小毛驴,一个游戏人 
梦想:世界和平   
原文地址: http://blog.csdn.net/liulongling
若有错误之处,请多多谅解并欢迎批评指正。     
本博客中未标明转载的文章归作者 小毛驴所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值