找回密码
 立即注册
查看: 3841|回复: 81

[网络] Warensoft Unity3D 通信库项目简介及使用教程

[复制链接]
发表于 2012-12-28 20:53 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Warensoft Unity3D 通信库项目简介及使用教程(发帖教程)
适用引擎:   (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线
该类库是专门为Unity3D编写的一个高性能通信库,其中包括了若干十分易于使用的Http通信类以及Socket通信类.另外最特别之处在于,它引入了一个全新的,基于Http协议的数据库访问组件,可以轻松访问MS SQL SERVER2005+.
Warensoft Unity3D通信库特点:
1.符合微软命名规范
作为一个C#开发人员,您会发现Unity3d中的命名规范与其他的C#例程中的命名规范大不相同,如字段公有化等.但是在该类库中,所有能够看到的内容(包括字段,属性,方法,事件)全部符合微软命名规范.
2.基于HTTP协议的通信
在Unity3D中,开发人员只能使用WWW类来处理Http的请求和响应,原有的在DotNet Framework中的WebRequest类和WebClient类,在Unity3D中是无法使用的.对于初学者来讲,WWW类的使用方法有点奇怪(当然,在3D引擎中,你必须这样做), 事实上,WWW类的使用方式与微软的编程风格完全不同. 当然,最令人头疼的是当你释放WWW类所占用的内存资源时,会出现较为明显的内存泄漏, 另外,过多使用WWW类会产生多线程并发问题,当开发人员同时建立多个WWW类的实例来并发访问多个Web资源时,经常会出现Too Many Threads(线程太多)的异常,然后整个系统就崩溃了.
Warensoft Unity3D通信库为您引入了一个全新代替方案:UnityHttpClient类.使用UnityHttpClient类发送Http请求以及获取响应将变的极为简单,另外,该类在自动在后台控制并发的线程数量.请对比以下两段代码,第一段是使用WWW类实现的,第二段代码是使用HttpClient类来实现的.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///With WWW Class
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class WWWTest:MonoBehaviour
{
    WWW www;
    void Start()
    {}
    private int initStep=0;
    void Update()
    {
        switch (this.initStep) {
        case 0:
            this.www=new WWW ("http://www.abc.com/default.aspx");
            this.initStep=1;
            break;
        case 1:
            if (this.WWW.isDone)//waite until the http response is finished
            {
                print(this.www.text);
            }
            break;
        default:
        break;
        }
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//With HttpClient class
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

public class HttpClientTest:MonoBehaviour
{
    HttpClient client;
void Start(){}
    private int initStep=0;
    void Update()
    {
if(this.initStep==0)
{
        //create an instance
         this.client=UnityCommunicationManager.CreateInstance().GetHttpClient();
        this.client.BeginGetHttpContent("http://www.abc.com/default.aspx",new Action<string>((result)=>
        {
            print(result);
        }));
        this.initStep=1;
}
    }
}
正像你看到的一个,使用HttpClient类是如此的简单!
3.基于TCP协议的通信
使用Http方式进行远程通信,固然可以解决绝大多数问题,但是有些时候你可能需要更快的通信,并且需要服务器可以将实时数据直接推送到客户端(不需要客户端定时查询).例如,在同一个场景中可能有很多人物在走动,这些人物不是NPC,而且它们都是由计算机前面的人来控制的.因此,你需要一个更快速的方法去同步这些人模的坐标信息.
最有效的解决方法就是基于TCP协议之上制定一系列的自定义协议.但不幸的是,关于Unity3D内置的network view 组件,官方并没有提供太多的,易于阅读和理解的文档.或者,你可以使用.NET Framework中的Socket类取而代之.Socket类可以说是一个万能的通信类,没有它搞不定的,但同时Socket类也是最低层的一个类,并且十分难以控制.
Warensoft Unity 通信库引入了一个用于替代的SocketClient类,一个使用简单,控制极为容易的类.
4.通过Warensoft数据访问服务访问MS SQL SERVER2005+数据库
出于安全角度考虑,在Unity3D的WebPlayer中,是不可以访问MS SQL SERVER的(ADO.NET不可用).像Silverlight和Flash一样,通常情况下富客户端应用一般都是不能访问数据库的(这是一点是默认的安全策略).在WebPlayer的环境下,最佳的实践方式就是使用代理模式(Proxy Pattern),或者干脆就在Web服务器上提供一个简单的Web服务接口(可以基于HTTP方式的服务,也可以是一个SOAP的Web服务等).
为此,我们为您提供了一个名为Warensoft数据服务的代理数据访问技术,并且在Warensoft Unity 通信库中提供了一组客户端代理类,仅仅需要几步,您就可以轻松的实现SQL SERVER数据库访问
------------------------------------------------------------------
------------------------------------------------------------------
Warensoft Unity3D通信库主要类型及其说明如下所示:
命名空间:
UnityCommunicationManager 类
该类是所有通信类的管理器类,所有的通信类都将使用该类构造实例.
命名空间:Warensoft.Unity.Communication
UnityHttpClient 类
该类是HTTP协议的通信类,通过指定一个URL,该类可以发送HTTP请求,并获取对应的服务器响应
SocketClient 类
该类是TCP协议通信类,通过指定远程服务器的IP地址和端口号,该类可以进行远程连接,并且发送数据和接收数据.

命名空间: Warensoft.Unity.Communication.DataClient
DataContext 类
该类通过Http协议对SqlServer连接进行管理.该类包含了所连接数据库中的所有数据表的影射,另外还提供了对这些表数据的增、删、改、查等功能。
DataEntity 类
数据实体类,代表一条数据记录
DataEntitySet 类
数据实体集合类,代表一个数据表
DataProperty 类
数据属性类,代表一个数据行中的数据列(字段)
DataPropertySet 类
数据属性集合类,代表一个数据行中所有的数据列(字段)
DataQuery 类
该类为SQL SERVER数据查询提供了许多构建方法,利用该类构建出来的查询,会被传送到Warensoft DataService服务器,并且被解析成数据库可以识别的SQL语句
------------------------------------------------------------------
------------------------------------------------------------------
利用Warensoft.Unity.Communication.Client.UnityHttpClient类可以实现Http Get请求以及POST请求,并可以使用简单的获取本次请求所对对应的响应。可以使用该类完全代替内置的WWW类。
推荐使用UnityHttpClient替代WWW的原因有以下几点:
               1>WWW类的使用不符合微软命名规范
               2>大量并发使用WWW类时会抛出Too Many Threads的异常.UnityHttpClient已经在内部对并发线程数量进行了控制.
使用UnityHttpClient类,代码更加简洁
下面通过代码展示如何使用UnityHttpClient类:
下载Warensoft Unity3D通信库
该类库是Codeplex上的开源项目,地址是:http://wucl.codeplex.com,从上面下载类库的最新版本,下载后得到两个DLL文件,其中Warensoft.Unity.Communication.dll就是我们在本Demo中用的DLL文件,另外一个Warensoft.DataService.dll是数据服务库,在后面的章节中会讲解如何使用.
为了客户端代码能成功演示,下面在VisualStudio中建立一个网站,当做Http服务器,为了演示UnityHttpClient对文件的请求,需要在网站中添加一个名为Test.xml的XML文件,以及一个test.png的PNG图,如下图所示:
  
Test.xml的内容如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<Customer>ALFKI</Customer>
</Root>
Test.png的图片如下所示:

3.为了演示通过Get方式请求数据,需要在网站中添加一个GetTest.aspx页面,其对应的ASPX.CS中的代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class GetTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//该代码功能是通过查询字符串CustomerID的值去查询该客户对应的公司名,
//并将查找到的公司返回给客户端
string customerid = this.Request.QueryString["CustomerID"];
if (customerid!=null )
{
string companyName = "";
using (SqlConnection con=new SqlConnection ("server=.;database=northwind;uid=sa;pwd=sa"))
{
var cmd = con.CreateCommand();
cmd.CommandText = "select companyname from customers where customerid=@customerid";
cmd.Parameters.AddWithValue("@customerid",customerid);
con.Open();
var result = cmd.ExecuteScalar();
if (result !=null )
{
companyName = result.ToString();
}
}
this.Response.Write(companyName);
this.Response.End();
}
}
}
4.为了演示通过POST方式发送数据,添加一个PostTest.aspx,其对应的CS文件代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class PostTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//该代码功能是通过获取客户端以Post方式发送的CustomerID的值去查询该客户//对应的公司名,并将查找到的公司返回给客户端
if (this.Request .ContentLength!=0)
{
//获取POST的数据流
var strm = this.Request.InputStream;
//建立缓冲区
byte[]buffer=new byte[this.Request .ContentLength];
//将POST过来的数据读取出来,并且存储在buffer中
strm.Read(buffer,0,buffer .Length );
//将二进制数据转化为字符串
string customerid = System.Text.Encoding.UTF8.GetString(buffer);
string companyName = "";
using (SqlConnection con = new SqlConnection("server=.;database=northwind;uid=sa;pwd=sa"))
{
var cmd = con.CreateCommand();
cmd.CommandText = "select companyname from customers where customerid=@customerid";
cmd.Parameters.AddWithValue("@customerid", customerid);
con.Open();
var result = cmd.ExecuteScalar();
if (result != null)
{
companyName = result.ToString();
}
}
this.Response.Write(companyName);
this.Response.End();
}
}
}
5.在Unity3D中建立一个新的项目,建立一个文件夹改名为Plugins,并将Warensoft.Unity.Communication.dll拷贝到该文件夹下面,如下图所示:

6.在Project中添加一个CS脚本,并将其命名为HttpTest.cs,其代码如下所示:
using UnityEngine;
using System.Collections;
using Warensoft.Unity.Communication.Client;
using System;
using System.Xml;
public class HttpTest : MonoBehaviour {
UnityHttpClient httpClient = null;
private Texture2D image;
    void Start () {
//启动时将httpClient初始化
this.httpClient = UnityCommunicationManager.CreateInstance().GetHttpClient();
this.httpClient.Error += new EventHandler<HttpRequestErrorEventArgs>(httpClient_Error);
    }
void httpClient_Error(object sender, HttpRequestErrorEventArgs e)
{
print(e.ResponseText );
}
int initStep = 0;
    void Update () {
if (this.initStep ==0&&this.httpClient!=null )
{
//获取XML文件
this.httpClient.BeginGetHttpContent("http://localhost:17737/test11/test.xml",
//后面的方法是本次异步Http请求成功并响应后的回调方法
new Action<XmlDocument>((doc) =>
{
//打印XML文件
print("response xml content:");
print(doc.OuterXml);
}));
//获取图片
this.httpClient.BeginGetHttpContent("http://localhost:17737/test11/test.png",
//后面的方法是本次异步Http请求成功并响应后的回调方法
new Action<Texture2D>((img) =>
{
this.image = img;
}));
//获取纯文本
//通过客户ID查询公司名
//GET方式
this.httpClient.BeginGetHttpContent("http://localhost:17737/test11/GetTest.aspx?CustomerID=ALFKI",
//后面的方法是本次异步Http请求成功并响应后的回调方法
new Action<string>((stringResult) =>
{
//打印公司名
print("Get the company name of alfki:" + stringResult);
}));
//获取纯文本
//通过客户ID查询公司名
//POST方式
byte[] contentBuffer = System.Text.Encoding.UTF8.GetBytes("ALFKI");
this.httpClient.BeginPost("http://localhost:17737/test11/PostTest.aspx", contentBuffer,
(response) =>
{
//打印公司名
print("Post the company name of alfki:" + response.StringContent);
});
this.initStep = 1;
}
    }
void OnGUI()
{
if (this.image !=null )
{
GUI.DrawTexture(new Rect (0,0,this.image .width,this.image.height),this.image);
}
}
}
7.将该cs文件拖放到该场景的主摄像机上,如下图所示:

8.保存项目并运行
游戏视图输出如下图所示:

控制台输出内容如下图所示:

项目下载地址:http://wucl.codeplex.com
本教程转自: http://www.cnblogs.com/warensoft

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2016-7-31 02:49 | 显示全部楼层

感谢楼主的无私分享!
发表于 2017-4-5 16:29 | 显示全部楼层
很不错
发表于 2017-4-5 17:14 | 显示全部楼层
顶顶多好
发表于 2017-4-5 17:19 | 显示全部楼层
难得一见的好帖
发表于 2017-4-5 16:36 | 显示全部楼层
说的非常好
发表于 2017-4-5 16:30 | 显示全部楼层
LZ真是人才
发表于 2017-5-16 12:23 | 显示全部楼层
楼主是超人
发表于 2017-5-16 12:38 | 显示全部楼层
真心顶
发表于 2017-5-16 12:35 | 显示全部楼层
难得一见的好帖
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-28 22:21 , Processed in 0.104325 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表