Unity程序向Web服务器发送数据

Unity程序向Web服务器发送数据

一、介绍

本文将演示一个简单的实例,从Unity程序向Web服务器发送数据,Web服务器收到数据后向Unity程序再返回数据。不附带HTTP架构设计需要自行动脑设计。

二、HTTP协议

Unity的WWW是基于HTTP协议的网络传输功能,HTTP(hypertext transport protocol)协议即超文本协议,它规定了万维网数据通信的规则,它是客户端、服务器模式,客户端和服务器都必须支持HTTP。HTTP协议的一个重要特点是每次连接只处理一个请求,当服务器处理完客户端的请求即断开连接,节省传输时间。

使用HTTP协议传输数据有多种方式,Unity的WWW主要支持其中的GET和POST方式。GET方式会将请求附加在URL后,POST方式则是通过FORM(表单)的形式提交。GET方式最多只能传输1024个字节,POST方式理论上则没有限制。从安全角度来看POST比GET方式安全性更高,所以在实际使用中更多选择POST方式。

下面,我们先创建一个简单的UI界面,提供两个按钮,分别用于使用GET和POST方式向服务器提交数据。(这里有不会搭建HTTP服务器的可以看我之前的文章Php与Apache环境配置

三、新建Unity工程,创建脚本

1.新建Unity工程,创建脚本WebManager.cs,将其指定给场景中的任意游戏体。

2.在WebManager.cs中添加一个m_info属性和OnGUI函数显示UI:

csharp 复制代码
string m_info = "Nothing";

    private void OnGUI()
    {
        GUI.BeginGroup(new Rect(Screen.width * 0.5f - 100,Screen.height * 0.5f -100,500,200),"");

        GUI.Label(new Rect(10,10,400,30),m_info);

        if (GUI.Button(new Rect (10,50,150,30),"GetData"))
        {
            
        }

        if (GUI.Button(new Rect(10,100,150,30),"Post Data"))
        {
            
        }

        GUI.EndGroup();
    }

运行程序,在窗口中会出现两个按钮,并显示"Nothing",如图所示。我们将使用Get Data和Post Data按钮分别通过GET 和 POST方式向Web服务器发送数据,然后服务器返回数据,传递给m_info属性显示在屏幕上。

四、GET请求

接下来我们使用GET方式向服务器提交数据,包括一个用户名和一个密码,服务器收到后返回一个字符串。

在WebManager.cs脚本中添加一个IGetData()函数,注意函数的返回类型是

csharp 复制代码
IEnumerator IGetData()
    {
        WWW www = new WWW("http://47.101.204.7:8088/index.php?username=get&password=123456");
        yield return www;
        if (www.error != null)
        {
            m_info = www.error;
            yield return null;
        }

        m_info = www.text;
    }

这个函数中,我们首先创建了一个WWW实例,使其向指定的IP地址发送GET请求,跟随在IP地址后面的?用于附加数据,这里我们发送了两个GET数据,一个是username,另一个是password,它们的值分别是get和12345。

WWW实例将在后台运行,yield return www会等待Web服务器的反映。

如果WWW实例的error属性不为空,Web服务器返回的数据则会保存在WWW实例的text属性中。

在OnGUI函数中添加代码执行IGetData函数:

csharp 复制代码
if (GUI.Button(new Rect (10,50,150,30),"GetData"))
        {
            StartCoroutine(IGetData());
        }

接下来,我们要创建一个PHP脚本响应WWW的GET请求。新建PHP工程,在Web服务器根目录创建index.php

php 复制代码
<?php
if ( isset($_GET['username']) && isset($_GET['password']) )
      echo 'username is '.$_GET['username'].' and password is '.$_GET['password']; 
else
      echo "error!"; 
?>

这是一段PHP代码,isset函数用来判断是否收到相应的GET请求,如果收到了,则使用echo函数输出结果,并将其返回到Unity程序中。(在PHP中,连接两个字符串是使用.而不是+)

测试如下

在Unity中运行程序,按一下Get Data按钮,然后会收到服务器返回的值,结果如下所示:

五、POST请求

使用POST提交数据的方式与GET类似,但我们将会把字符串转为byte数组。

在WebManager.cs脚本中添加一个IPostData()函数:

csharp 复制代码
IEnumerator IPostData()
    {
        Dictionary<string,string> headers = new Dictionary<string, string>();
        headers.Add("Content_Type","application/x-www-form-urlencoded");

        string data = "username=post&password=6789";
        byte[] bs = System.Text.UTF8Encoding.UTF8.GetBytes(data);
        WWW www = new WWW("http://47.101.204.7:8088/index.php",bs,headers);
        yield return www;

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

        m_info = www.text;
    }

与GET不同的是,在保存数据的字符串中,最前面没有?符号,但仍使用&符号连接数据,最后我们将字符串转为一个byte数组。headers在以前版本是一个HashTable现在都改为了Dictionary,它由键、值对应,这里我们用它来保存HTTP包头。

在OnGUI函数中添加代码执行IPostData函数:

php 复制代码
if (GUI.Button(new Rect(10,100,150,30),"Post Data"))
        {
            StartCoroutine(IPostData());
        }

修改PHP脚本,添加POST请求的响应:

php 复制代码
<?php
if ( isset($_GET['username']) && isset($_GET['password']) )
      echo 'username is '.$_GET['username'].' and password is '.$_GET['password']; 
else if ( isset($_POST['username']) && isset($_POST['password']) )
      echo 'username is '.$_POST['username'].' and password is '.$_POST['password'];
else
      echo "error!"; 
?>

测试如下:

在Unity中运行程序,按一下Post Data按钮,然后会收到服务器返回的数据

相关推荐
还是大剑师兰特7 分钟前
面试题:ES6模块与CommonJS模块有什么异同?
前端·es6·大剑师
胡西风_foxww22 分钟前
【ES6复习笔记】数值扩展(16)
前端·笔记·es6·扩展·数值
mosen86824 分钟前
uniapp中uni.scss如何引入页面内或生效
前端·uni-app·scss
白云~️25 分钟前
uniappX 移动端单行/多行文字隐藏显示省略号
开发语言·前端·javascript
沙尘暴炒饭27 分钟前
uniapp 前端解决精度丢失的问题 (后端返回分布式id)
前端·uni-app
昙鱼41 分钟前
springboot创建web项目
java·前端·spring boot·后端·spring·maven
天天进步20151 小时前
Vue项目重构实践:如何构建可维护的企业级应用
前端·vue.js·重构
小华同学ai1 小时前
vue-office:Star 4.2k,款支持多种Office文件预览的Vue组件库,一站式Office文件预览方案,真心不错
前端·javascript·vue.js·开源·github·office
APP 肖提莫1 小时前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
问道飞鱼1 小时前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js