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

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

  • 一、介绍
  • 二、HTTP协议
  • 三、新建Unity工程,创建脚本
    • 1.新建Unity工程,创建脚本WebManager.cs,将其指定给场景中的任意游戏体。
    • 2.在WebManager.cs中添加一个m_info属性和OnGUI函数显示UI:
  • 四、GET请求
    • 在WebManager.cs脚本中添加一个IGetData()函数,注意函数的返回类型是
    • 在OnGUI函数中添加代码执行IGetData函数:
    • 接下来,我们要创建一个PHP脚本响应WWW的GET请求。新建PHP工程,在Web服务器根目录创建index.php
    • 测试如下
  • 五、POST请求
    • 在WebManager.cs脚本中添加一个IPostData()函数:
    • 在OnGUI函数中添加代码执行IPostData函数:
    • 修改PHP脚本,添加POST请求的响应:
    • 测试如下:

一、介绍

本文将演示一个简单的实例,从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:

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()函数,注意函数的返回类型是

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函数:

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

接下来,我们要创建一个PHP脚本响应WWW的GET请求。新建PHP工程,在Web服务器根目录创建index.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()函数:

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函数:

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

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

<?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按钮,然后会收到服务器返回的数据

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费福利马上截止!深圳的户外小伙伴别错过!COSP2024体育展来了

COSP2024户外博览会 展会时间&#xff1a;2024年3月14-16日 展会地址&#xff1a;深圳福田会展中心 户外运动爱好者不可错过&#xff01; COSP2024户外博览会不仅可以逛展 看各种露营装备、户外器材 还有各种沙龙、峰会活动 就在明年开年&#xff0c;阳春三月天&#xf…

服务器扩容未生效、不成功:解决方法

记一次解决服务器扩容未生效的解决办法 老板&#xff1a;失忆啊&#xff0c;我花钱给服务器扩容了10000000G&#xff0c;但是数据库和mq都还是用不了&#xff0c;到底是不是服务器磁盘满了&#xff0c;你到底有没有查一下什么原因导致服务用不了啊。 失忆&#xff1a;老板您确…

哪个牌子的台灯对学生的视力好?五款学生备考台灯推荐

护眼台灯在如今市场中销量越来越高&#xff0c;我作为一名电器测评博主&#xff0c;非常支持大家使用护眼台灯来提升日常的照明光线环境&#xff0c;它通过LED灯和专业的护眼技术&#xff0c;可以有效缓解用眼疲劳、帮助放松和舒适照明。但需要注意的是&#xff0c;目前市场中品…

Yarn ResourceManager 页面上的绿色条块(Used Resources)反映的是真实的资源占用情况吗?

过去&#xff0c;一直习惯于在 Yarn 的 ResourceManager 页面上&#xff0c;通过菜单&#xff1a;Cluster -> Scheduler 查看当前 Yarn 总体的资源分配状况&#xff0c;因为这个页面非常直观。不过&#xff0c;在最近一次测试中&#xff0c;我发现&#xff1a;Yarn Resource…

(Matlab)基于CNN-LSTM的多输入分类(卷积神经网络-长短期记忆网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、代码实际运行结果展示&#xff1a; 三、部分代码展示&#xff1a; 四、本文完整代码数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码…

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系

本文为学习所用&#xff0c;严禁转载。 本文参考链接 https://zhuanlan.zhihu.com/p/667382398 QPSK代码及高斯白噪声如何产生 https://ww2.mathworks.cn/help/signal/ref/butter.html 滤波器 https://www.python100.com/html/4LEF79KQK398.html 低通滤波器 本实验使用matlab仿…

毫米波RIS研究测试方案:一站式助力工程师探索高频通信未来

方案介绍 在当前科技高速发展的时代&#xff0c;毫米波通信技术因其高数据传输速率和大容量的潜力而备受瞩目。其中&#xff0c;可重构智能表面&#xff08;RIS&#xff09;作为一项创新技术&#xff0c;正在为毫米波通信系统的设计和优化带来新的可能性。为了应对这一领域的研…

Linux系统安装及管理

目录 一、Linux应用程序基础 1.1应用程序与系统命令的关系 1.2典型应用程序的目录结构 1.3常见的软件包装类型 二、RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 2,1查看已安装的软件包格式 2.2查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂…

WebGL技术实现机械工程培训

机械工程培训的虚拟环境可以通过 WebGL 技术实现&#xff0c;提供沉浸式的三维体验&#xff0c;帮助学生学习机械结构、运动原理和装配过程。以下是开发机械工程培训虚拟环境的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

后台管理百度地图-获取位置信息

1.在输入框中输入位置获取经纬度&#xff0c;拿到经纬度用定点标记在地图上 2.鼠标点击地图中的位置&#xff0c;调用组件点击事件拿到经纬度用定点标记在地图上&#xff0c;删除之前的定点标记&#xff0c;拿到的地址赋值到输入框中&#xff0c; 引入百度地图&#xff1a; &l…

旧衣回收小程序搭建有什么优势?

今年以来&#xff0c;旧衣回收行业分外火热&#xff0c;不断有创业者进入到市场中&#xff0c;其中不乏有年轻人&#xff0c;足以可见行业的火爆。 我国是人口大国&#xff0c;每个人闲置的衣物加在一起的数量难以计算&#xff0c;旧衣回收行业具有巨大的发展空间。 此外&…

fragstats:景观指数的突变分析

作者&#xff1a;CSDN _养乐多_ 本文将介绍景观指数时间序列的突变分析&#xff0c;包括突变时间、突变频次等。以及景观指数突变分析所用的软件和 python 代码。 结果如下图所示&#xff0c; 图1 突变频次 图2 突变时间 文章目录 一、景观指数计算二、景观指数时间序列构建…

静态HTTP与动态内容:一场“静”与“动”的较量

嘿&#xff0c;小伙伴们&#xff01;你们有没有遇到过这样的困惑&#xff1a;静态HTTP和动态内容&#xff0c;这俩到底有啥区别&#xff1f;今天&#xff0c;我就来给大家好好讲讲这其中的奥妙&#xff01; 首先&#xff0c;我们来聊聊静态HTTP。这家伙就像个老实巴交的“宅男…

计算机网络概述(下)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天继续计算机网络概述的学习&#xff0c;下面&#xff0c;让我们一起进入计算机网络概述的世界吧&#xff01;&#xff01;&#xff01; 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…

IntelliJ IDEA安装教程

IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超…

20、Qt使用QLibrary类调用动态链接库dll中的成员函数

一、功能说明 创建一个项目&#xff0c;里面包含两个子项目&#xff0c; 子项目1生成动态链接库dll&#xff0c;里面包含一个加法和一个减法&#xff1b; 子项目2是带界面的可执行文件exe&#xff0c;使用QLibrary类来调用子项目1的dll。 二、创建子项目1 新建项目&#x…

搭建react+ant design pro+umi 项目框架

一、 写本文的原因 我搭建reactantdumi这个框架的原始资料主要是来源于&#xff08;ReactUmi4从零快速搭建中后台系统保姆级记录教程&#xff08;一、项目创建及初始化&#xff09;&#xff09; 而我写这篇文章的本意就是用来记录我用搭建时候的步骤汇总。 二、 npm和node版…

Vue 官方周报 #125 - 强制重新渲染Vue组件的最佳方法

Hi &#x1f44b; 圣诞快乐&#x1f384;&#x1f389; 如果您需要强制重新渲染Vue组件&#xff0c;那么您很可能会遇到Vue的响应系统问题。根据我的经验&#xff0c;您可能没有正确使用Vue的响应系统。 但是在某些情况下确实需要强制重新渲染组件。一个例子是当您使用与Vue的…

压力应变电桥信号隔离放大变送器差分输入变送直流模块0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

主要特性 DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输…

Qt/C++控件设计器/属性栏/组态/可导入导出/中文属性/串口网络/拖曳开发

一、功能特点 自动加载插件文件中的所有控件生成列表&#xff0c;默认自带的控件超过120个。拖曳到画布自动生成对应的控件&#xff0c;所见即所得。右侧中文属性栏&#xff0c;改变对应的属性立即应用到对应选中控件&#xff0c;直观简洁&#xff0c;非常适合小白使用。独创属…