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']; 
elseecho "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'];
elseecho "error!"; 
?>

测试如下:

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倾斜摄影三维模型数据在行业应用分析

倾斜摄影三维模型数据在行业应用分析 倾斜摄影三维模型数据是一种重要的地理信息资源&#xff0c;可以广泛应用于各个行业和场景&#xff0c;以解决不同领域的问题。以下将详细探讨几个典型的行业或场景&#xff0c;它们利用倾斜摄影三维模型数据解决问题的应用。 1、地理测绘…

游戏软文推广:软文推广如何点燃玩家热情

在数字化时代&#xff0c;随着科技的迅猛发展&#xff0c;游戏产业日益蓬勃&#xff0c;成为了娱乐市场中的一匹黑马。而在游戏行业中&#xff0c;软文推广逐渐成为一种有效而巧妙的宣传手段。本文将深入探讨游戏软文推广的潜力&#xff0c;以及通过这种方式所能够达到的宣发效…

springboot整合JPA 多表关联 :一对多 多对多

补充一下自定义SQL 这是连表查询&#xff0c;可以任意查出字符&#xff0c;用Map接收 Testvoid test3() {JPAQueryFactory jpaQueryFactory new JPAQueryFactory(em);QStudent student QStudent.student;QMessage message QMessage.message;//constructor(StuMesDto.class, …

【JVM】虚拟机的组成+字节码文件组成+类的生命周期

什么是JVM&#xff1f; JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM的功能 1.解释和运行&#xff1a;对字节码文件中的指令实时的解释成机器码让计算机执行。 2.内存管理&#xff1a;自动为对象、方法等分配内存&#xff0c;自动…

C++类的继承

目录 什么是继承&#xff1f; 父类与子类对象的赋值转换 继承中的作用域问题 子类的默认成员函数问题 如何使一个类不能被继承&#xff1f; 父类的友元和静态成员变量 多重继承与菱形继承 继承和组合 什么是继承&#xff1f; 继承 (inheritance) 机制是面向对象程序设…

数据库系统概论 ---知识点大全(期末复习版)

&#xff08;一&#xff09;绪论 数据(Data)&#xff1a;是数据库中存储的基本对象 数据的定义&#xff1a;描述事物的符号记录 数据的种类&#xff1a;文字、图形、图象、声音等 数据的特点&#xff1a;数据与其语义是不可分的 数据库(Database,简称DB)&#xff1a;是长期…

React 路由传参

引言 在上一篇中&#xff0c;我们学习了 React 中使用路由技术&#xff0c;以及如何使用 MyNavLink 去优化使用路由时的代码冗余的情况。 这一节我们继续上一篇 React 路由进行一些补充 1. Switch 解决相同路径问题 首先我们看一段这样的代码 <Route path"/home&q…

用栈和队列分别实现求解迷宫问题(c++,c)

求解迷宫问题&#xff1a;给定一个迷宫要求输出其路径。 给出的迷宫如下&#xff08;可自行更改&#xff09; 可用两种方法实现1.栈2.队列 用栈只能找到路但路不是最简的最简的要用队列实现 用栈实现&#xff08;解析都在代码里了&#xff09; c&#xff08;实现&#xff0…

Linux系统编程(六):进程(下)

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 进程与程序 1.1 main() 函数由谁调用&#xff1f; C 语言程序总是从 main 函数开始执行int main(void) int main(int argc, char *argv[]) // 如果需要向应用程序传参&#xff0c;则选择该种写法操作系…

应急响应中的溯源方法

在发现有入侵者后&#xff0c;快速由守转攻&#xff0c;进行精准地溯源反制&#xff0c;收集攻击路径和攻击者身份信息&#xff0c;勾勒出完整的攻击者画像。 对内溯源与对内溯源 对内溯源&#xff1a;确认攻击者的行为 &#xff0c;分析日志 数据包等&#xff1b; 对外溯源&…

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S 2023/12/23 14:14 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2…

Druid源码阅读-DruidStatInterceptor实现

上次我们在druid-spring-boot-starter里面看到有一个DruidSpringAopConfiguration的配置类&#xff0c;然后引入了DruidStatInterceptor这样一个切面逻辑。今天我们就来看一下这个类的实现。 DruidStatInterceptor 这个类的包路径下入com.alibaba.druid.support.spring.stat。…