Unity3d 前端与后端之间的数据交互

原创 2015年11月18日 17:12:58
在Unityd3d,与后端交互比较多的是Http协议,Socket套接字;

HTTP协议:Unity的 WWW 就是基于HTTP协议的网络传输功能,HTTP协议即超文本协议,HTTP协议的一个重要特点就是每次连接只处理一个请求,当服务器处理完客户端的请求后即断开连接,节省传输时间(适合用作短连接)
在Unity中,WWW主要支持其中的GET和POST方式。GET方式会请求附加在URL后,POST方式是通过FORM(表单)的形式提交。GET方式最多只能传输1024个字节,POST方式理论上没有限制。(实际使用POST方式比较多)

//WWW中的GET方式
IEnumerator IGetDate()
{
    WWW www = new WWW("http://127.0.0.1/test.php?username=get&password=12345");
    yield return www;
    string m_info = String.Empty;

    if (www.error != null)
    {
        m_info = www.error;
        yield return null;
    }

    m_info = www.text;
}

向指定的IP地址(http://127.0.0.1/test.php)发送GET请求,“?”后面用于附加数据,发送两个GET数据,一个是username:get,一个是password:123456,WWW实例会在后台运行,yield return www 等待Web服务器的反应,返回的数据会保存在www.text中

//POST请求
IEnumerator IPostData()
{
    System.Collections.Hashtable headers = new System.Collections.Hashtable();
    headers.Add("Content-Type","application/x-www-form-urlencoded");

    string data = "username=post&password=123456";
    bytes bs = System.Text.UTF8Encoding.UTF8.Getbytes(data);

    WWW www = new WWW("http://127.0.0.1/test.php",bs,headers);

    yield return www;

    string m_info = string.Empty;
    if (www.error != null)
    {
        m_info = www.error;
        yield return null;
    }

    m_info = www.text;
}

headers是一个Hashtable,由建,值对应,这里用它来保存HTTP报头,保存数据的字符串中,仍用“&”符号连接数据

通过.net提供的Socket功能实现基于TCP/IP协议的网络通讯(一般游戏都采用这个):
www可以用于动态请求,但是,无法满足实时交互的网络需求,这个时候就需要建立长连接,Socket套接字之间的连接过程分三个步骤:服务器监听,客户端请求,连接确认,这里只做客户端的请求:

public class StateObject
{
    private const int BUFFER_SIZE = 327680;
    private Socket worker;
    private static byte[] buffer = new byte[BUFFER_SIZE];

    public StateObject(Socket worker)
    {
        this.worker = worker;  //保存服务器Socket对象
    }

    //用来接收数据返回的Socket对象
    public Socket Worker
    {
        get {return this.worker;}
        set {this.worker = value;}
    }

    //用来接收服务端返回的数据
    public byte[] Buffer
    {
        get{return buffer;}
        set{buffer = value;}
    }

    public int bufferSize
    {
        get {return BUFFER_SIZE;}
    }
}

//建立Socket 连接
public bool Connect(string address, int remotePort)
{
    try
    {
        IPAddress[] ips = Dns.GetHostAddresses(address);  //解析域名
        IPEndPoint remoteEP = new IPEndPoint(ips[0],port);  //获得远程服务器的地址
        Socket client = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  //创建Socket
        client.BeginConnect(remoteEP,new AsyncCallback(OnConnectCallback),client); //开启异步连接
    }
    catch (System.Exception e)
    {
        Debug.Log("Connect fail! : " + e);
        return false;
    }
    return true;
}

//连接操作完成调用回调
private void OnConnectCallback(IAsyncResult ar)
{
    try
    {
        Socket client = (Socket)ar.AsyncState;  //获得服务器Socket
        client.EndConnect(ar);  //与服务器取得连接

        cnn = client;  //保存服务器Socket
        Receive();  //接收服务器发送过来的数据
    }
    catch(System.Exception e)
    {
        Debug.Log("OnConnectCallback fail! : " + e);
    }
}

//接收服务端发送过来的数据
public void Recive()
{
    try
    {
        StateObject so = new StateOject(cnn); //定义一个StateObject类,用来保存服务器Socket对象,以及服务器传过来的数据

        so.Worker.BeginReceive(so.buffer,0,so.BufferSize,0,new AsyncCallback(OnReceiveCallBack),so);
    }
    cahch(System.Exception e)
    {
        Debug.Log("Recive:" + e);
    }
}

//调用接收成功的返回回调
private void OnReceiveCallBack(IAsyncResult ar)
{
    try
    {
        StateObject so = (StateObject)ar.AsyncState;
        int bytesRead = so.Worker.EndReceive(ar);  //结束异步读取,返回接收到的字节数
        if (bytesRead < 1) //接收字节为0,与服务器断开连接
        {
            ClioseSocket();
            return;
        }

        //这里可以进行解析数据包
    }
    catch(System.Exception e)
    {
        Debug.Log("OnReceiveback: " + e);
    }
}

//发送数据包字节
protected bool Send(byte[] buffer)
{
    try
    {
        Socket client = cnn;   //这里cnn为之前建立连接之后保存的服务器Socket对象
        client.BeginSend(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(OnSendCallBack),client);
    }
    catch(System.Exception e)
    {
        Debug.Log("Send : " + e);
    }
}

//调用发送回调
private void OnSendCallBack(IAsyncResult ar)
{
    try
    {
        Socket client = (Socket)ar.AsyncState;
        int bytesWritten = client.EndSend(ar);
    }
    catch(System.Exception e)
    {
        Debug.Log("SendCallBack : " + e);
    }
}

//关闭Socket连接
public void Close()
{
    try
    {
        Socket client = cnn;

        client.Shutdown(SocketShutdown.Both);
        client.BeginDisconnet(false,new AsyncCallback(OnCloseCallBack),client);
    }
    catch(System.Exception e)
    {
        Debug.Log("close : " + e);
    }
}

private void OnCloseCallBack(IAsyncResult ar)
{
    try
    {
        Socket client = (Socket)ar.AsyncState;
        client.EndDisconnet(ar);
        client.Close();
    }
}

数据包的解析,等有空再写过来,这里只是自己对Socket跟Http的一点理解

U3D前后端开发知识体系

U3D前后端开发知识体系一、知识体系:二、学习总结: 游戏研发团队及岗位职责 Unity3D工具、Mono工具、内部脚本工作原理以及跨平台特性 .NET技术的发展及其跨语言和...
  • woaini454186694
  • woaini454186694
  • 2016年06月17日 12:10
  • 1615

Unity与Android之间的交互之AndroidManifest

AndroidManifest,中文名一般称之为清单文件。它描述了应用程序的组件的活动、服务,广播接收机,内容提供商,应用程序组成、应用程序的Java包命名、权限、特性等。每个安卓应用程序必须有一个A...
  • qq_15003505
  • qq_15003505
  • 2017年04月18日 19:52
  • 3246

[网络]Unity和PHP的Http数据交互

最近在为公司写一些简单的数据统计。最早是用Socket写的交互,但后面觉得有点大材小用,就尝试写了个http的交互。...
  • carefreeq
  • carefreeq
  • 2016年05月12日 17:27
  • 827

Unity3d 游戏与C#服务器 异步Socket 交互 (一)

Unity3d中提供了Socket供开发者使用,语法和.net中的一致。 一般来说,对于手游客户端,分为两个线程,一个是GLES渲染,另一个就是Socket线程了。 不论是服务器,还是客户端。其间...
  • cp790621656
  • cp790621656
  • 2015年01月25日 20:55
  • 11064

Unity Socket 交互编程

这几天研究了下Socket交互。     通过网上的资料做了有关Socket的第一个Demo,虽然不是很成熟,但个人感觉已经相对比较完整了。各类型数据的传输接受都有,其中也做了float类型的(因为...
  • zhou_xw6511
  • zhou_xw6511
  • 2013年01月08日 09:30
  • 24750

Unity3D之Web Player与unity的互相传值交互

Web Player是Unity3d自带的一个Web端插件。它可以作为普通的网站来用也可以与Unity3d进行交互。 现在先讲unity传向Web player的方法。非常简单只有一句代码: App...
  • alayeshi
  • alayeshi
  • 2016年03月07日 18:40
  • 4724

Unity3d和服务器交互

简单说一下: U3D和服务器基于Http协议进行数据交互。 U3D中提供WWW 类,也可以使用.Net 中WebClient 不过建议使用WWW类,毕竟是U3D中的。其实说到这个只要去理解WWW类即可...
  • withdreams
  • withdreams
  • 2016年11月08日 01:02
  • 3586

unity3D中使用Socket进行数据通信(三)

今天跟大家继续学习下socket,由于最近有个招标参数需要给之前的一款产品做教师端以及后台数据库部分,忙了将近两个礼拜,今天刚发布了,就继续我们的socket通信部分。          之前服务端一...
  • lj34207310
  • lj34207310
  • 2016年03月11日 18:23
  • 10848

unity游戏开发之服务器与客户端或页面流转之自定义交互事件

引言:    1,游戏页面与页面的交互 (1)装备背包 (2)装备信息页面      在游戏开发中,2D页面之间,有时候少不了关联性,比如游戏的背包系统,玩家进入背包系统(见上图装...
  • zhetianyun
  • zhetianyun
  • 2014年12月26日 10:45
  • 2903

U3D服务器端开发知识点总结

U3D服务器端开发知识点总结写在前面: 这篇文章会比较杂,针对服务器端遇到的问题或比较重要的知识点,搞清楚了之后加入自己的理解记录下来,也就是我自己的一些个知识点总结笔记。 一、 TCP/IP三...
  • woaini454186694
  • woaini454186694
  • 2016年06月19日 18:57
  • 2262
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3d 前端与后端之间的数据交互
举报原因:
原因补充:

(最多只允许输入30个字)