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.pswp.cn/news/536722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536722.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

npm使用詳解(好吧好吧是粗解)

目錄 npm是什么&#xff1f; npm有什么用&#xff1f; npm安裝 在 Windows 上 在 macOS 上 在 Linux 上&#xff08;使用 apt 包管理器為例&#xff09; 驗證 npm 安裝成功&#xff1a; npm使用 1. 初始化項目&#xff1a; 2. 安裝和管理依賴&#xff1a; 3. 查看和…

【DataV】DataV組件庫——更新數據視圖不更新

參考文章&#xff1a;dataV組件庫——改變數據視圖不主動刷新 問題&#xff1a; 拿到后端數值就直接賦值了&#xff0c;但是視圖&#xff08;頁面&#xff09;沒有更新。 解決&#xff1a; 官方文檔介紹dataV里面的組件props均未設置deep監聽&#xff0c;刷新props時&#xf…

一個利用摸魚時間背單詞的軟件

大家好&#xff0c;我是 Java陳序員。 最近進入了考試季&#xff0c;各種考試&#xff0c;英語四六級、考研、期末考等。不知道大家的英語四六級成績怎么樣呢&#xff1f; 記得大學時&#xff0c;英語四級都是靠高中學習積累的老本才勉強過關。 而六級則是考了多次&#xff…

20231224解決outcommit_id.xml1 parser error Document is empty的問題

20231224解決outcommit_id.xml1 parser error Document is empty的問題 2023/12/24 18:13 在開發RK3399的Android10的時候&#xff0c;出現&#xff1a;rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

靜態HTTP的常見問題和解決方法

大家好&#xff0c;歡迎來到今天的“靜態HTTP大講堂”&#xff01;今天我們要聊聊靜態HTTP的常見問題和解決方法。別小看這些問題哦&#xff0c;它們就像是那些頑皮的小妖精&#xff0c;時不時地給你的網站搞點惡作劇。不過別擔心&#xff0c;有我在&#xff0c;這些小妖精都得…

推薦一款好用的免費圖片轉換工具bmp轉png工具bmp2png

推薦一款好用的免費圖片轉換工具bmp轉png工具bmp2png 寫這個工具是因為要使用傳奇的部分素材在COCOS2DX使用&#xff0c;但是COCOS2DX不支持BMP如果直接將BMP轉換到PNG的話&#xff0c;網上找到的工具都不支持透明色轉換。難道要用PS一個一個摳圖嗎&#xff1f;要累死所以寫了…

HBase 超大表遷移、備份、還原、同步演練手冊:全量快照 + 實時同步(Snapshot + Replication)不停機遷移方案

博主歷時三年精心創作的《大數據平臺架構與原型實現:數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行,點擊《重磅推薦:建大數據平臺太難了!給我發個工程原型吧!》了解圖書詳情,京東購書鏈接:https://item.jd.com/12677623.html,掃描左側二維…

如何選擇適合業務的負載均衡策略?

在分布式系統的高可用設計中&#xff0c;負載均衡非常關鍵&#xff0c;我們知道&#xff0c;分布式系統的特性之一就是支持快速擴展&#xff0c;那么集群擴展之后&#xff0c;服務請求如何從服務器列表中選擇合適的一臺呢&#xff1f;這就需要依賴負載均衡策略。 負載均衡在處…

免 費 搭 建 小程序商城,打造多商家入駐的b2b2c、o2o、直播帶貨商城

在數字化時代&#xff0c;電商行業正經歷著前所未有的變革。鴻鵠云商的saas云平臺以其獨特的架構和先進的理念&#xff0c;為電商行業帶來了全新的商業模式和營銷策略。該平臺涉及多個平臺端&#xff0c;包括平臺管理、商家端、買家平臺、微服務平臺等&#xff0c;涵蓋了pc端、…

項目執行常用的ChatGPT通用提示詞模板

項目啟動與準備&#xff1a;如何確保項目按計劃啟動&#xff0c;并為項目執行做好充分準備&#xff1f; 任務分配與執行&#xff1a;如何合理分配任務&#xff0c;確保項目團隊成員明確各自的責任和目標&#xff1f; 進度監控與調整&#xff1a;如何實時監控項目進度&#xf…

Python 數據分析 Matplotlib篇 plt.rcParams 字典(第5講)

Python 數據分析 Matplotlib篇 plt.rcParams字典(第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ?????????????????????????????????????????????????????????????????????????…

17.仿簡道云公式函數實戰-數學函數-ABS

1. ABS函數 ABS 函數可用于返回數字的絕對值 2. 函數用法 ABS(number) 3. 函數示例 如&#xff0c;ABS(-12)和ABS(12)的返回結果均為 12。 4. 代碼實戰 首先我們在function包下創建math包&#xff0c;在math包下創建AbsFunction類&#xff0c;代碼如下&#xff1a; pac…

Python是什么?

Python是一種高級編程語言&#xff0c;具有簡單易學、代碼可讀性強、開發效率高等特點。它采用解釋型執行方式&#xff0c;可以跨平臺運行&#xff0c;并且擁有豐富的第三方庫和框架支持&#xff0c;被廣泛應用于Web開發、數據分析、人工智能等領域。 文章目錄 一、Python的歷…

定位 CPU 高負載 Java 線程

常用命令 # 按照 CPU 使用率排序輸出進程信息 ps -eo pid,ppid,%cpu,%mem,cmd --sort-%cpu# 監控對應 pid 進程下的所有線程按照 CPU 排序 top -Hp "$pid" -o %CPU # jstack 輸出 JVM 堆棧信息 jstack $pid演示事例 查看高負載 Java 進程獲取到對應 pid $ ps -eo …

免費福利馬上截止!深圳的戶外小伙伴別錯過!COSP2024體育展來了

COSP2024戶外博覽會 展會時間&#xff1a;2024年3月14-16日 展會地址&#xff1a;深圳福田會展中心 戶外運動愛好者不可錯過&#xff01; COSP2024戶外博覽會不僅可以逛展 看各種露營裝備、戶外器材 還有各種沙龍、峰會活動 就在明年開年&#xff0c;陽春三月天&#xf…

【辦公技巧】ppt如何加密只能看不能修改?

大家是否想要給PPT文件設置加密&#xff0c;讓ppt文件變為只能查看不能修改的狀態&#xff1f;今天給大家分享給PPT文件設置帶有密碼的只讀模式&#xff08;修改權限&#xff09;。 方法如下&#xff1a; PPT文件之后&#xff0c;將PPT文件進行另存為操作&#xff0c;但是在選…

【反射1】——Java基礎(韓順平講解)

一個需求&#xff0c;引出反射 | 完整的反射使用流程&#xff1a; 在不修改源碼的情況下&#xff0c;來控制程序&#xff0c;也符合設計模式中的opc原則(開閉原則&#xff1a;不修改源碼&#xff0c;擴容功能) 1、創建配置文件&#xff1a;re.properties classfullpathcom.r…

SATA和M.2接口的異同點

SATA和M.2接口是連接存儲設備的兩種常見接口&#xff0c;它們在物理尺寸、傳輸速度、線纜和接頭以及適用設備類型等方面有著顯著的異同點。 物理尺寸 SATA接口通常用于2.5英寸硬盤、3.5英寸硬盤等傳統機械硬盤以及SSD&#xff0c;而M.2接口則是一種較為新型的接口標準&#xff…

裝飾 Web3 項目的用戶交互界面(Web3項目二實戰之四)

用戶交互界面是Web3項目必不可少的,畢竟,Web3項目最終是面向用戶的,所以,Web3項目總得需要一個優美的UI界面,已達到用戶在視覺上精彩盛宴。 誠然,一個Web3項目若到了用戶交互界面,大體上,這個Web3項目也將告一段落了。 沒錯,Web3第二個項目,也將終結于本篇,順勢拉開…

線下終端門店調研包含哪些內容

品牌渠道一般分為線上和線下&#xff0c;線上的價格、促銷信息、店鋪優惠機制等都可以通過登錄查看&#xff0c;但是線下門店的數據則需要進店巡查&#xff0c;否則無法得到真實的店鋪銷售數據&#xff0c;當然也有品牌是靠線下的業務團隊報備機制獲得這些信息&#xff0c;但是…