转一篇Unity客户端与Java服务器的通信
转自:http://www.programering.com/a/MTNxYDMwATQ.html
A few days ago a friend asked me about Unity3D inside Protobuf, was something to write this off until now, feel shy.
In this paper, the test environment:
System: WINDOWS 7 (third, 6), OS (fourth) X 10.9
Software: VS 2012 (third, 6), Eclipse (fifth, 6)
Hardware: iPad 2 (fourth), Macbook Pro Mid 2012 (step fourth)
Article directory:
1, About Protobuf C#
2, Why some Protobuf released to the iOS is not, even some in the PC are used?
3, Protobuf C# version of the manual processing
3.1, Create a C# project, the first manual create each through the Protobuf serialization or deserialization of data model classes, and then export the DLL
3.2, Create a serialized C# project, and then run the generated DLL
3.3, The above two projects generated DLL onto unity
4, In Unity deserialization Protobuf
5, The server Java with Protobuf
6, Too much bother?! The client will automatically handle Protobuf
1, About Protobuf C#
First of all, U3D Protobuf is using C# to achieve, so there are several optional C# implementation:
C#: http://code.google.com/p/protobuf-csharp-port
C#: http://code.google.com/p/protosharp/
C#:
C#/.NET/WCF/VB: http://code.google.com/p/protobuf-net/
Here I used is the http://code.google.com/p/protobuf-net/ (you can download his code and tools in https://code.google.com/p/protobuf-net/downloads/list here), It is a relatively good, Provide a variety of platform support, After decompression in the "Full" directory can be seen in every platform support

See the inside of the unity, it will be ready to use our protobuf-net.dll.
2, Why some Protobuf released to the iOS is not, even some in the PC are used?
a, Protobuf uses JIT, namely in the run-time dynamic compilation, and the characteristics in the Unity release to the iOS is not supported. Therefore, cause you can run on PC, released to the iOS have a problem.
b, Protobuf is based on the.Net 2 framework, while Unity only supports.Net 2, or some characteristics more 2, and you release set a subset of.Net 2 in Unity. You only need to modify the latter can be set up in Player setting.
The above two can also be applied to other third party libraries, if you download a PC or C# inside the normal use of the library, in which U3D can not be used, so please check whether it is the result of the above two reasons.
3, Protobuf C# version of the manual processing
Know the above problems, as long as we choose a.Net2.0 Protobuf, then it is not a JIT, it can be used as normal.
Here is the idea of:
3.1, Create a C# project, the first manual create each through the Protobuf serialization or deserialization of data model classes, and then export the DLL
In the case of VS, first, create a class library project: "file" > " > " new " " > " " (remember to choose.Net framework 2)

The unity protobuf DLL add to project references

Then assume that you have a class WorkerInfo is needed by Protobuf serialization and deserialization, then create a WorkerInfo class, as follows:
using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf;
namespace Com.YourCompany.Project.Proto.Module{
[ProtoContract]
public class WorkerInfo { [ProtoMember(1)]
public int workerId; [ProtoMember(2)]
public int leftClosingTimeSec; [ProtoMember(3)]
public int buildingId; }
}
Press Shift+ F6 DLL, the project's bin\Debug directory can be found ProtoModelDLL.dll.
3.2, Create a serialized C# project, and then run the generated DLL
Also in the case of VS, first create a console application: "file" > " > " new " " > " " console application; (remember to choose.Net framework 2)

Add the Protobuf and the 3.1 generation DLL to reference

Written in the project generated in Program.cs:
using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf.Meta;
using ProtoBuf;
using ProtoBuf.Compiler;
using Com.YourCompany.Project.Proto.Module; namespace ProtoModelSerializerCreator
{
class Program
{
static void Main(string[] args)
{
var model = TypeModel.Create(); model.Add(typeof(object), true);
model.Add(typeof(WorkerInfo), true); model.AllowParseableTypes = true;
model.AutoAddMissingTypes = true;
model.Compile("ProtoModelSerializer", "ProtoModelSerializer.dll");
}
}
}
Then ctrl+ F5 operation, you can see the ProtoModelSerializer.dll in bin\Debug.
3.3, The above two projects generated DLL (ProtoModelDLL.dll and ProtoModelSerializer.dll) and protobuf-net.dll onto unity
How to use the fourth step?
4, In Unity deserialization Protobuf
Because of the general game client requests data volume is simple, less, therefore we request is not directly in front of the binary request. The front end is received and returned by Protobuf, and so. This discussion Protobuf deserialization.
The following code is very simple, write a test code:
using UnityEngine;
using System.Collections;
using ProtoBuf.Meta;
using Com.YourCompany.Project.Proto.Module;
using System.IO;
using Com.Duoyu001.Proto.Building;
using Com.Duoyu001.Proto.Worker; public class TestProto : MonoBehaviour
{ // init
void Start ()
{
byte[] dataFromServ = new byte[]{8, 233, 7, 16, 100, 24, 1}; //these bytes are generated by server RuntimeTypeModel serializer = BitchSerializer.Create ();
System.IO.MemoryStream memStream = new System.IO.MemoryStream ();
WorkerInfo w = new WorkerInfo ();
serializer.Deserialize (memStream, w, w.GetType ()); //asign value to proto model Debug.Log (w.workerId + ", " + w.buildingId + ", " + w.leftClosingTimeSec);
}
}

After running the Unity console output worker information. The dataFromServ byte array code in the content of the actual communication when the rear end should be returned. This test is not related to Socket communication of knowledge.
5, The server Java with Protobuf
To see a client using Protobuf so much trouble, how will it end? In fact, the back-end is relatively simple, with the official Google support.
Download: https://code.google.com/p/protobuf/downloads/list
After decompression is such(2.5.0):

Into the "protobuf-2.5.0\java" folder, There is a maven project, You create a protobuf-java-2.5.0.jar in the target directory will use the Maven clean install jar package., No Maven download here., I used to generate maven. This time to import your Java project. You can.
And then you write a proto file, called "protobuf-2.5.0\src" inside the protoc.exe is generated, it will help you to generate a java file. (see https://developers.google.com/protocol-buffers/docs/javatutorial), here I have to provide a bat, used to call the protoc to generate the java file, manual input words too much trouble. Save it to.Bat and then double-click can be run under Windows.
@echo off
echo ** setting runtime variable REM _protoSrc is your proto file directory location
set _protoSrc=F:\project_proto_src\trunk\xgame-controllers\protos REM protoExe is used for the proto generated from the Java protoc.exe program position
set protoExe=C:\Users\john\Desktop\protobuf-2.5.0\src\protoc.exe REM java_out_file to store the generated Java file directory location
set java_out_file=F:\project_proto_src\trunk\xgame-controllers\src\main\java\ for /R "%_protoSrc%" %%i in (*) do (
set filename=%%~nxi
if "%%~xi" == ".proto" (
%protoExe% --proto_path=%_protoSrc% --java_out=%java_out_file% %%i
)
)
OK, you just put the generated Java copied to or directly into a Java project your source directory, then you can use the. For example:
As said before WorkerInfo as an example
package com.duoyu001.xgame;
import java.util.Arrays;
import com.duoyu001.xgame.worker.proto.WorkerInfoBuilder.WorkerInfo;
public class TestProto {
public static void main(String[] args) {
WorkerInfo w = WorkerInfo.newBuilder().setBuildingId(1)
.setLeftClosingTimeSec(100).setWorkerId(1001).build();
byte[] byteArray = w.toByteArray();
System.out.println(Arrays.toString(byteArray));
}
}
The console will output: 
The careful students will find the byte and above the "8, 233, 7, 16, 100, 24, 1" is not quite the same. Second numbers are -23 and 233
In fact, this is only byte has no symbolic difference.
Their binary representation is: 11101001
6, Too much bother?! The client will automatically handle Protobuf
We see the client is not a class, will need to increase the code in two project in VS, and the rear end is directly based on the proto generated code file. So, it seems a bit unfair, and that before and after the end of may produce different. In fact, protobuf I personally feel that the biggest benefit:
a, A small amount of data
b, The proto generated code template, reduce the front end alignment
But now only reduces the working front end, did not decrease, so the second advantage is not obvious.
That would be fine. I'm not so satisfied. Therefore, I decided, front end to generate the CS file based on proto.
Therefore, I use Java to compile a Proto file analysis tools, and according to the proto to generate the CS file, and then used to construct the executive vs program bat invokes the vs command line, the last generation of two DLL.
I put the above command are integrated into a bat, so the bat task is:
The execution of a java program, proto files to generate CS files.
The use of vs interface to construct two vs projects, generating two DLL.
Through the SVN to the two DLL submitted to the client on the trunk.
Call it according to the proto Java generated bat fragments, java code generation.
Through the SVN to generate java code is submitted to the server on the trunk.
Therefore, in this way, now as long as the compiled proto file, and then double-click the bat, before and after the end of available Protobuf data object through the latest update SVN.
Bat operation

According to the proto CS file is generated and compiled two vs projects, then the generated DLL submitted to SVN

Java code is generated and submitted to SVN
This step operation we are interested can try, there are problems discussed in this blog welcome.
转一篇Unity客户端与Java服务器的通信的更多相关文章
- unity客户端与c++服务器之间的简单通讯_1
// 服务器 # pragma once using namespace std; # include <iostream> # include <string> # incl ...
- 解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据(代码)(Oracle)。
---------------------------------ajaxUtil----------------------------------------------------------- ...
- [经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信[2]
在前一篇文章中, 我们实现了从Java netty 服务端到 unity 客户端的通讯, 但是在过程中也发现有一些问题是博主苦苦无法解决的, 但是还好终于有些问题还是被我找刀方法解决了, 现在把这些解 ...
- Java基础知识强化之网络编程笔记10:TCP之客户端读取文本文件服务器控制台输出
1. TCP之客户端读取文本文件服务器控制台输出 (1)客户端:(发送数据到服务端) package cn.itcast_10; import java.io.BufferedReader; impo ...
- Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中
1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...
- elasticsearch 口水篇(4)java客户端 - 原生esClient
上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生 ...
- 在C#客户端用HTTP上传文件到Java服务器
在C#客户端用HTTP上传文件到Java服务器 来源:http://www.cnblogs.com/AndyDai/p/5135294.html 最近在做C / S 开发,需要在C#客户端上传文件到 ...
- JAVA服务器与C#客户端的通信技术调研
JAVA服务器与C#客户端的通信技术调研 研究背景及目的: ARPG项目的需求:需要将现有的服务器从C++的编写平台换为java语言.在对需求进行分析的过程中,发现几点需要研究实现的问题 java与c ...
- Java实现IO通信(服务器篇)
Java实现IO通信(服务器篇) 如何利用java实现我们的通信呢?首先我们了解一下什么是通信?通信的机制是怎样的? 首先来讨论一下什么是通信?通信,指人与人或人与自然之间通过某种行为或媒介进行的信息 ...
随机推荐
- SQL Server开发接口生成方法
为提高开发效率,生成固定格式的接口是必须的,以下以提供新增/修改/删除/读取接口为例: 以常见的表结构为例,特殊表结构可自己尝试去调整方法 主要通过系视图 sys.columns生成方法:为包含列的对 ...
- oracle忘记sys/system/scott用户密码了,如何重置oracle密码?
今天用到的oracle数据库,但是发现以前设置的密码,忘记了,怎么输入都不对,所以从网上找了一下资料,解决了,然后整理分享给大家. 一.遇到的问题: 1..忘记除SYS.SYSTEM用户之外的用户的登 ...
- CentOS系统在不重启的情况下为虚拟机添加新硬盘
一.概述 用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备.但是我们也可能会遇到这样的情况,比如正在运行比 ...
- hdu 4967 Handling the Past
hdu 4967 Handling the Past view code//把时间离散化,维护一个线段(线段l到r的和用sum[l,r]表示),pop的时候就在对应的时间减一,push则相反 //那么 ...
- TCP的关闭,到底是几次握手,每次的标志位到底是什么!
做题的时候遇到一个问题,TCP关闭的时候到底是三次还是四次握手,如果是三次,少了哪部分? 按照 <计算机网络> -第五版-谢希仁 然而对于TCP关闭, 有的地方能找到 ...
- Facebook的体系结构分析---外文转载
Facebook的体系结构分析---外文转载 From various readings and conversations I had, my understanding of Facebook's ...
- MMORPG大型游戏设计与开发(客户端架构 part1 of vegine)
重写有些核心接口的时候,其实遇到了许多的问题,甚至一度的想过要放弃,但是最终还是坚持了下来.在客户端提供的这些接口中,可以清晰的看到客户端所依赖的各种模块的支持,以及各自之间的一些关联.下面只是介绍了 ...
- 【CSS】使用边框和背景
1. 应用边框样式 先从控制边框样式的属性开始.简单边框有三个关键属性:border-width.border-style 和 border-color . <!DOCTYPE html> ...
- javaSE ---OOP总结
面向对象编程(Object Oriented Programming,OOP)是当前最主流的编程范式之一,Java是一门纯面向对象的编程语言.我们常说C++是一门面向对象的编程语言,C++是C语言的一 ...
- SQL触发器、事物
触发器: 触发器为特殊类型的存储过程,可在执行语言事件时自动生效.SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. 当服务器或数据库中发生数据定义语言 (D ...