最近在做一个项目,主体是Unity。项目涉及到一些大规模数值计算,需要借助服务器来完成。所以我们需要设计一个通信系统,包含以下过程。

1.Unity客户端向服务器发送计算命令
2.服务器调用后台进程进行数值计算
3.服务器通知Unity客户端计算完成
4.Unity客户端从服务器读取计算结果

为了实现该系统,我们需要这些东西

1.一台终端Windows计算机,安装了Unity,作为客户端。
2.一台Linux计算机,搭建了服务器环境,作为后台计算。

将Linux计算机搭建为服务器的方法请参考:
搭建基于阿里云服务器的网站

搭建好环境后,接下来开始系统实现。

(一)Unity客户端

这部分主要使用了UnityWebRequest功能,该模块可以很好地实现上传文件到服务器以及从服务器下载数据的需求,下面给出了测试代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.Text;public class CS_communication_test : MonoBehaviour
{public string url_PHP = "http://x.x.x.x/CS_test/CS.php";public string url_download = "http://x.x.x.x/CS_test/result.txt";// Start is called before the first frame updatevoid Start(){StartCoroutine(CS_work(100));}IEnumerator CS_work(int num){//测试功能:使用服务器将一个整数×100,打印计算结果//第一部分:上传数据到服务器,等待服务器处理完成byte[] bytes = Encoding.Default.GetBytes(num.ToString());WWWForm form = new WWWForm();//创建提交数据表单form.AddField("folder", "UploadData/");//定义表单字段用来定义文件夹form.AddBinaryData("file", bytes, "uploadData.txt", "text/plain");//字段名,文件数据,文件名,文件类型UnityWebRequest uploadRequest = UnityWebRequest.Post(url_PHP, form);yield return uploadRequest.SendWebRequest();if (uploadRequest.isDone){Debug.Log("服务器已完成计算");}//第二部分:从服务器获取计算结果UnityWebRequest downloadRequest = UnityWebRequest.Get(url_download);yield return downloadRequest.SendWebRequest();if (downloadRequest.isDone){Debug.Log(downloadRequest.downloadHandler.text);}}
}

(二)服务器

我们使用Python来编写计算进程,用PHP作为Web中间交互,用Linux的命名管道实现PHP与Python的进程通信。

1.实验环境设置

我们来到网站的根目录下

如果按照上述博客搭建服务器的话,地址是/var/www/html

创建实验文件夹,并设置权限

mkdir CS_test
chmod 777 CS_test

进入文件夹,创建命名管道文件

cd CS_test
mkfifo -m 777 php2py # 保存php进程向python进程传递的数据
mkfifo -m 777 py2php # 保存python进程向php进程传递的数据

创建文件夹,用来保存上传的数据,记得设置权限

mkdir UploadData
chmod 777 UploadData

分别创建一个python文件和一个php文件

touch CS.py
touch CS.php

目前实验文件夹下有这些东西

[root@iZwz9a8g2mt6x5kq9jp6abZ CS_test]# ls
CS.php  CS.py  php2py  py2php  UploadData

2.python文件编写

这部分的功能是数值计算,将php2py管道中的原始数据读出,计算后将结果写入py2php管道。

def work(rawData):print("input number: " + rawData)resultData = str(int(rawData) * 100)print("output number: " + resultData)return resultDatawhile True:fread = open("php2py", "r")fwrite = open("py2php", "w")rawData = fread.read(1024)resultData = work(rawData)fwrite.write(resultData)fwrite.close()fread.close()

3.php文件编写

这部分的功能是

1.接收Unity客户端的调用,将其上传的数据写入文件
2.数据写入php2py管道
3.从py2php管道读出计算结果
4.将结果写进文件

<?php$folder=$_POST["folder"];//根据表单字段接收文件夹的字符串信息$fileName =$_FILES["file"]["name"];//根据表单字段接收需要保存的文件名字$tmp=$_FILES["file"]["tmp_name"];$fil=$folder.$fileName;// 判断当期目录下的 upload 目录是否存在该文件if (!file_exists($fil)){// 如果 upload 目录不存在该文件则将文件上传到相应目录下move_uploaded_file($_FILES["file"]["tmp_name"], $fil);}//将数据写入管道function write($content){$fwrite = fopen("php2py", "w");fwrite($fwrite, $content);fclose($fwrite);}//将数据从管道读出function read(){$fread = fopen("py2php", "r");$content = fread($fread, 1024);fclose($fread);return $content;}//读出上传的数据,并写入管道$dataStr = file_get_contents("UploadData/uploadData.txt");$data = number_format($dataStr);write($data);//从管道读出计算结果$resultData = read();//将计算结果写入结果文件$writeFile = fopen("result.txt","w");fwrite($writeFile,$resultData);fclose($writeFile)?>

(三)系统测试

完成上述任务后,我们开始实验测试。

1.在服务器中启动python进程

python CS.py

2.在Unity中将脚本挂在一个场景物体上,并运行测试

服务器端结果

input number: 100
output number: 10000

Unity客户端结果

实验成功!

最后记得将Python进程中断。

基于Unity的C/S架构数据交互相关推荐

  1. 基于Apache Thrift的公路涵洞数据交互实现原理

    基于Apache Thrift的公路涵洞数据交互实现原理 Apache Thrift简介 Apache Thrift(以下简称为"Thrift") 是 Facebook 实现的一种 ...

  2. 基于unity+HTC VIVE的室内漫游交互(教你如何“无代码”VR交互)

    简单粗暴,一个插件让你无代码实现VR交互 开发环境steamVR2.0+unity2017.1.0f1 steamVR2.0下载地址 一.总体目标 Unity+HTC VIVE 开发: 1.场景漫游+ ...

  3. iOS开发-------基于WKWebView的原生与JavaScript数据交互

    WKWebView是iOS8.0之后用以替代UIWebView的网页浏览器,包含在WebKit中,可以通过 @import WebKit 导入.如果工程需要适配iOS7,那么请在iOS7中使用UIWe ...

  4. AUTOSAR从入门到精通-【应用篇】基于无线网络的汽车 ECU 数据交互模块研发

    目录 前言 国内外研究现状 国外研究现状 国内研究现状

  5. 【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务

    基于Blink为新商业调控打造实时大数据交互查询服务 案例与解决方案汇总页: 阿里云实时计算产品案例&解决方案汇总 从IT到DT.从电商到新商业,阿里巴巴的每个细胞都存在大数据的DNA,如何挖 ...

  6. 基于 ETC 专用短程通信的车路协同 第 1 部分:应用集及应用数据交互需求

    本站文章引用或转载写明来源,感谢原作者的辛苦写作,如果有异议或侵权,及时联系我处理,谢谢! 更多车路协同,车路协同建设解决方案,参考链接:https://gitee.com/AiShiYuShiJie ...

  7. 基于 ETC 专用短程通信的车路协同 第 2 部分:应用层数据交互格式

    本站文章引用或转载写明来源,感谢原作者的辛苦写作,如果有异议或侵权,及时联系我处理,谢谢! 更多车路协同,车路协同建设解决方案,参考链接:https://gitee.com/AiShiYuShiJie ...

  8. 基于车路协同的高等级自动驾驶数据交互内容

    基于车路协同的高等级自动驾驶数据交互内容 基于车路协同的高等级自动驾驶系统组成 1. 系统架构 2. 系统功能 2.1 RSS各组成单元功能 2.2 VSS各组成单元功能 3. 系统交互 基于车路协同 ...

  9. Cache 与Memory架构及数据交互

    Cache 与Memory架构及数据交互

最新文章

  1. 学术 | 热议:寒门硕士要不要继续读博士?
  2. 欧盟「人脑计划」​最新进展:新算法模拟生物进化,为大脑如何工作提供新见解...
  3. 【PyCharm编辑器】之引用selenium包提示错误:Unresolved reference 'selenium' less... (Ctrl+F1)...
  4. uvalive5798(树状数组)
  5. 第二次启用httpd24调用mysql时出现的错误
  6. CodeForces - 566A Matching Names(字典树上贪心)
  7. [leetcode] 206.反转链表
  8. 【Antlr】Antlr语法设计
  9. C# --- WinForm基本知识与绘图(上)
  10. JavaWeb项目作业 Market商品管理系统
  11. 找特征点的算法 SIFT和SURF算法
  12. eclipse安装教程|最详细eclipse安装 配置图文教程
  13. phusion passenger standalone
  14. stm32定时器配置与时间计算公式
  15. C 语言还值得学习吗?C 语言会过时吗?C 语言解惑
  16. logits and labels must be broadcastable: logits_size=[131072,9] labels_size=[131072,8]的错误
  17. 任正非:为什么华为选择与西工大合作,而没选清华北大,mysql连接查询原理
  18. centos搭建USDT omni钱包节点
  19. 1200plc通过pn总线控制v90程序 此程序是关于西门子1200PLC以profernet方式式控制V90伺服的的功能块程序
  20. 数据结构课程设计实验验优参考(附数据结构上机实验、上机考试代码)

热门文章

  1. 逆水寒江湖无限服务器等级,逆水寒上限多少级 逆水寒等级上限是多少
  2. larval 捕获mysql错误_larval中怎样捕获mysql错误
  3. 计算机学院早操规定,计算机学院早操动员大会顺利召开
  4. C# Predefined type 'System.Object' is not defined or imported
  5. apache代理503
  6. 酶促反应动力学_酶促反应动力学讲解.ppt
  7. 上树建站教程:新手单页网站制作教程上集
  8. 【翻译】“PE文件格式”1.9版 完整译文(附注释)
  9. 一种小微商户的调额方法值得您参考
  10. VIVO内置应用卸载指南(IQOO NEO5为例)