zoukankan      html  css  js  c++  java
  • Unity的http通信--unity与python的django通信

    http://blog.csdn.net/chenggong2dm/article/details/17372203

    写在前面:

    WWW类,是unity里,简单的访问网页的类。本文介绍的就是这种方式,与web服务器之间进行通信。当然,HTTP通信,也可以自己通过socket去写,自己实现一个http通信。

    WWW类可以用来发送GET和POST请求到服务器,WWW类默认使用GET方法,并且如果提供一个postData参数可用POST方法。这里我们主要使用实用性更强一些的POST方式。

    WWW的完整构造函数如下:

    WWWurl:string, postData:byte[], headers:Hashtable )

    • url
      The url to download.
    • postData
      A byte array of data to be posted to the url.
    • headers
      A hash table of custom headers to send with the request.

    ■注意:这个构造函数,有函数重载,可以省略第三个headers参数,也就是:

    WWWurl:string, postData:byte[] )


    实际例子:

    1,新建一个空项目。【File】-->【New Project】

    2,新建一个2D背景,用于衬托UI。【GameObject】-->【CreateOther】-->【GUI Texture】

    3,写HttpTest.cs脚本文件,绑定到摄像机上。代码如下:


    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class HttpTest : MonoBehaviour {  
    5.     //variables  
    6.     public string str_uid = "";  
    7.     public string str_score = "";  
    8.     public string str_response = "";  
    9.       
    10.     // Use this for initialization  
    11.     void Start () {  
    12.       
    13.     }  
    14.       
    15.     // Update is called once per frame  
    16.     void Update () {  
    17.           
    18.     }  
    19.       
    20.     //在C#中, 需要用到yield的话, 必须建立在IEnumerator类中执行  
    21.     IEnumerator TestPost()  
    22.     {  
    23.         //WWW的三个参数: url, postData, headers  
    24.         string url = "http://127.0.0.1/test/";  
    25.         byte[] post_data;  
    26.         Hashtable headers;   //System.Collections.Hashtable  
    27.           
    28.         string str_params;  
    29.         str_params = "uid=" + str_uid + "&" + "score=" + str_score;   
    30.         post_data = System.Text.UTF8Encoding.UTF8.GetBytes(str_params);  
    31.         //Encoding encode = System.Text.Encoding.GetEncoding("utf-8");  
    32.         //byte[] post_data = encode.GetBytes("uid=中文&score=100");  
    33.         headers = new Hashtable();  
    34.         //headers.Add("Content-Type","application/x-www-form-urlencoded");  
    35.         headers.Add("CONTENT_TYPE""text/plain");  
    36.           
    37.         //发送请求  
    38.         WWW www_instance = new WWW(url, post_data, headers);  
    39.           
    40.         //web服务器返回  
    41.         yield return www_instance;  
    42.         if (www_instance.error != null)  
    43.         {  
    44.             Debug.Log(www_instance.error);  
    45.         }  
    46.         else  
    47.         {  
    48.             this.str_response = www_instance.text;  
    49.         }   
    50.     }  
    51.       
    52.     void OnGUI () {  
    53.         GUI.Label(new Rect(10,20,60,20),"UID:   ");   
    54.         GUI.Label(new Rect(10,45,60,20),"Score: ");   
    55.         //注意:因为每一帧都在刷, 所以[文本框]是这种写法:  
    56.         str_uid = GUI.TextField(new Rect(60, 20, 160, 20), str_uid);  
    57.         str_score = GUI.TextField(new Rect(60, 45, 160, 20), str_score);  
    58.           
    59.         //发送Http的POST请求  
    60.         if (GUI.Button(new Rect(120,80,100,25),"发送请求"))  
    61.         {  
    62.             StartCoroutine(TestPost());  
    63.         }  
    64.           
    65.         this.str_response = GUI.TextArea(new Rect(10, 150, 210, 100), this.str_response);   
    66.     }  
    67. }  

    4,运行。效果如下:



    5,点击,发送POST请求,并显示服务器返回的结果:



    附注A:

    下面是对应的web服务器端代码:

    本例的web服务器,使用的是python的django,使用方法可以参加我上一篇文章:【新版django1.6的Hello world】

    views代码如下:

    [python] view plaincopy在CODE上查看代码片派生到我的代码片
    1. #! /usr/bin/env python  
    2. #coding=utf-8  
    3.   
    4. from django.http import HttpResponse  
    5.   
    6. def test_post(request):  
    7.     fanhui = u'服务器返回: ' + u'用户UI:'+ unicode(request.POST['uid']) +' '  
    8.     fanhui = fanhui + u'分数:'+ unicode(request.POST['score'])  
    9.     return HttpResponse(fanhui)  


    附注B:

    如果使用django,注意要把中间件里的:

    'django.middleware.csrf.CsrfViewMiddleware',        注释掉。否则请求会因为CSRF机制,给拦下,报403错误。

    或者干脆禁用中间件,也行。

  • 相关阅读:
    error MSB6006: ”cmd.exe” exited with code 1
    OpenGL简介
    OSG例程(1) 交互(Pick)
    $err,hr
    [转载]操作数的寻址方式
    严重推荐的图形学讲义
    编译通过,运行时osgDB::ReadImageFile()出错 d和非d的lib
    空间变换的顺序SRT
    OSG例程(3) 利用更新回调制作路径动画
    Visitor模式的C++实现
  • 原文地址:https://www.cnblogs.com/nafio/p/9137512.html
Copyright © 2011-2022 走看看