基于Unity的C/S架构数据交互

2 篇文章 0 订阅

最近在做一个项目,主体是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 update
    void 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 resultData

while 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进程中断。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Unity3D多平台网络斗地主的设计与实现毕业设计 目录 前言 1 第1章 概述 2 1.1 系统开发背景 2 1.2 设计的目的 3 1.3 设计的意义 3 第2章 开发环境及相关技术介绍 4 2.1 开发环境介绍 4 2.1.1 Unity3D简介 4 2.1.2 Visual Stdio2010和MonoDevelop 5 2.1.3 Xcode简介 5 2.2 C#语言和Javascript脚本 6 2.2.1 C#语言 6 2.2.2 Javascript语言 6 2.3 IOCP框架简介 7 2.3.1 IOCP内部工作队列图 7 2.3.2 程序实现IOCP模型的基本步骤 8 2.3.3 使用IOCP模型和不使用IOCP模型通讯的对比 8 2.4 本章小结 10 第3章 系统需求分析 10 3.1 用户功能需求分析 10 3.2 系统性能要求 10 3.3 可行性分析 10 第4章 总体方案设计 11 4.1 纸牌设计 11 4.1.1 牌型设计 11 4.1.2 出牌类型(游戏规则)设计 12 4.2 C/S模式 12 4.2.1 基于C/S模式的服务器端设计流程图 12 4.2.2 基于C/S模式的客户端设计流程图 12 4.3 游戏逻辑程序结构 13 4.3.1 数据层 13 4.3.2 控制层 13 4.3.3 显示层 14 4.4 游戏设计流程图 14 4.5 数学建模 15 第5章 详细设计与系统实现 16 5.1 斗地主洗牌算法 16 5.2 斗地主之"排序"算法 16 5.3 基于IOCP的Socket通讯 18 5.4 User对象的设计 19 5.4.1 玩家状态设计 19 5.4.2 玩家的属性以及手牌的操作方法 20 5.5 Table对象的设计 21 5.5.1 桌子状态设计 21 5.5.2 Table的属性及方法 21 5.6 粘包问题 23 5.6.1 TCP和UDP的介绍以及区别 23 5.6.2 粘包介绍及处理 23 第6章 发布和测试 25 6.1 服务器端性能检测 25 6.2 打包发布Android应用 27 6.2.1 导出Android设置 27 6.2.2 真机效果图 28 6.3 打包发布IOS应用 29 6.3.1导出IOS设置 29 6.3.2真机效果图 31 6.4 打包发布Web应用 32 6.4.1 关于UnityWebPlayer的SandBox Security(安全沙盒机制) 32 6.4.2 导出Web设置 32 6.4.3 运行结果 33 6.5 打包发布PC/Linux应用 34 6.6 整体测试效果 34 结束语 40 致谢 42 参考文献 43 附录A 网络斗地主的游戏规则 44 附录B 部分程序代码 47 前言 近年来,随着科技和互联网的飞速发展、智能手机的迅速普以及性能的不断提升,游 戏行业也突飞猛进,游戏已经逐渐成为人们公认的第九种艺术。现在各个平台上的游戏 逐渐涌现,从最初的红白机,到PC机再到XBox平台发展到如今的手机移动平台,从端游 到页游再到手游甚至是体感游戏等表现形式也逐渐丰富,当然成功的也数不胜数。比较 大型的游戏有:反恐精英、星际争霸、使命召唤,生化危机等。当然也涌现了诸多经典 的网络小游戏,比如麻将、拖拉机、中国象棋等。此外手机游戏,如愤怒的小鸟、保卫 萝卜、FlappyBird、切水果、捕鱼达人等也赢得许多人的青睐。这些各种各样形式的游 戏给如今生活在网络时代的人们带来了无限的生活乐趣。 斗地主是一款相当经典的游戏,当然前人也做了不少版本,有移动端,pc端甚至是W eb端的。可能他们在设计的过程中只是正对某一平台然后使用特性的开发技术来开发, 这样的话如果想要实现多平台的设计就需要极大的时间成本和劳力成本。而Unity3D引擎 的问世,最大的解决了这一问题,它能够实现一次开发多平台发布的特点,这也是为什 么Unity3D引擎在短暂的时间里能够发展的如此迅速的原因。将斗地主游戏从单机版到网 络化,使得现实中的多个玩家能够在同一个虚拟房间里面进行对局,并且能够实时的聊 天,同时还不会受到平台的限制,你可以选择pc,web或者是移动端,从而能更好的体验 游戏,娱乐生活。 第1章 概述 1.1 系统开发背景 随着Unity3D引擎的横空出世,游戏开发技术也变得越来越成熟,这款引擎也逐渐改 变了整个游戏圈的开发格局,之前火遍了全球的神庙逃亡就是基于Unity引擎开发的一款 比较成功的手游大作,这也更很好的证明了Unity作为一款游戏引擎还是值得开发者的信 赖。Unity相比较之前大家都熟悉的Unreal虚幻引擎,我认为Unity做的更好,它最值得 人称赞的就是它的跨平台性是其他游戏引擎无法匹敌的,Unity能够做到一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值