Unity如何实现网络通讯(一):HTTP

时间:2024-04-09 12:01:12
网络通讯一般有强联网和弱联网,强联网我们一般使用TCP或者UDP,弱联网则是最常用的HTTP。今天我们首先来说一说HTTP。
超文本传输协议(HTTP,HyperText Transfer Protocol)是当前最广泛的网络协议,这里不讲述HTTP的发展和底层,我们直奔主题,看HTTP如何访问和使用。
首先我们要做的就是有一个服务器,就是一个网站,我们可以通过visual Studio来建立网站,如图:
Unity如何实现网络通讯(一):HTTP
然后添加webApi来导入模板,如下图操作:
Unity如何实现网络通讯(一):HTTP
点击确定然后生成我们的模板,我们会看到在右边的解决方案视图能看到许多已经建好的文件夹和文件,这是WebAPI帮助我们生成的,然后我们可以点击运行看是否可以运行,如果可以运行,说明我们建的网站可以使用,然后我们可以再初始界面上看见一个类,里面是我们通过修改网站路径可以获取到的值,如下图:
Unity如何实现网络通讯(一):HTTP
Unity如何实现网络通讯(一):HTTP
这样,我们就可以在浏览器看到我们在vs中的值。我们会发现返回的值是Get方法中的字符串数组,如果我们想要获取有参方法中的值,就需要通过Get方法输入参数来访问:只需要在原有路径后加上 '?id=2'就可以访问了(不包含引号)。
接下来就是发布网站了,我们可以再右侧找到自己的网站点击右键点击发布:
Unity如何实现网络通讯(一):HTTP
如果之前没有配置文件可以点击下拉菜单->新建,然后创建自己的配置文件,名称自己定,然后点击连接,把发布方法改为“文件系统”,路径建议放在图中位置,记得在wwwroot下再创建一个文件夹,否则生成的文件会散布在wwwroot文件中,和其他网站文件发生混乱。
Unity如何实现网络通讯(一):HTTP
然后点击设置,将配置改为Release,然后点击发布。注意:如果发布失败,可能是因为权限问题,我们可以使用管理员身份打开vs然后再次发布便可以成功。
当网站发布成功,我们便可以使用微软为我们提供的IIS来对网站进行部署:
如果是win10系统,直接在cortona中输入IIS就可以打开,不同系统IIS的位置可以自己查询,打开IIS后,我们开始新建网站:
Unity如何实现网络通讯(一):HTTP
点击网站然后新建,会弹出一个界面,设置自己的网站名称,物理路径选择之前我们发布的路径,然后修改端口号,因为默认的80端口已经被占用,我们可以自己设定一个端口号,0-65535均可,然后点击确定。生成后我们可以点击右侧浏览来测试网站是否建立成功。
如果我们的网站建立失败,很有可能是因为IIS的一些服务没有开启,这个可以再网上查询,开启相应服务便可以使用。

接下来我们可以再Unity中去请求了:
首先说一下Get请求:
我们可以通过www类去请求HTTP,URL就是我们的网站地址,需要说的一点是HTTP是必须发出请求后才可以从服务器上获取资源,所以我们每需要一次,就需要请求一次,也可以一次把资源全部请求,但一般不会这样做。
然后就是开启协程,等待请求完毕,然后接受返回的信息:
 private void GetURL(string URL)
    {
        WWW data = new WWW(URL);
        StartCoroutine(Request(data));
    }
然后说一下Post请求:
Post请求会多一个WWWForm类,通过AddField方法来添加参数,相当于Get方法路径后的“?id=3”,
private void PostURL(string URL, int id)
    {
        //定义一个表单
        WWWForm form = new WWWForm();
        //给表单添加值
        form.AddField("id", 3);
        WWW data = new WWW(URL, form);
        StartCoroutine(Request(data));
    }
最后实现协程的具体逻辑:
private IEnumerator Request(WWW data)
    {
        yield return data;
        if (string.IsNullOrEmpty(data.error))
        {
           Debug.Log(data.text);
        }
        else
        {
            Debug.LogError(data.error);
        }
    }
这样,如果没有错误的情况下,我们会返回text文本信息,使我们请求的值,如果返回的是一个类,则我们收到的是一个json串,我们可以通过LitJson插件进行解Json来解析数据。
最后说一下Get方式和Post方式的差别,使用Get方式效率要高,但是安全性会降低,Post方式则相反,所以使用哪种方式我们要根据实际情况来判断。