Netty4.XUnity与Netty使用protoBuf

Posted 程序员小毛驴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty4.XUnity与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 若有错误之处,请多多谅解并欢迎批评指正。      本博客中未标明转载的文章归作者 小毛驴所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

以上是关于Netty4.XUnity与Netty使用protoBuf的主要内容,如果未能解决你的问题,请参考以下文章

Netty系列化之Google Protobuf编解码

如何用 Protégé 中的其他标准本体扩展本体?

如何在 Protégé 中创建财产?

专区Netty使用与源码解析

将 SPDY 与 Netty 一起使用

10.netty客户端与服务器使用protobuf传输报文