unity 网络通信 json方式

1.每一个场景必须要挂的通信代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class WWWUrl : MonoBehaviour
{
    public static WWWUrl Instance;
    public OnReceiveDelegate OnReceive;
    public static string WebError = null;

    public Text Cuowu;

    public void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            // DontDestroyOnLoad(this.gameObject);
        }
        else
        {
            //Destroy(gameObject);
        }

    }


    public void SendWebMessage(string url)
    {
        StartCoroutine(Send(url));
        Debug.Log("链接网站:" + url);
    }

    /// <summary>
    /// 从网站上获取数据
    /// </summary>
    /// <param name="url">地址</param>
    /// <returns></returns>
    IEnumerator Send(string url)
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();
        WebError = request.error;

        if (request.isNetworkError || request.isHttpError)
        {
            Debug.LogError(request.error);
            Cuowu.text = "错误:" + WebError + "网址:" + url;
        }
        else
        {
            //文字格式转换一下UTF8编码格式,防止出错
            string msg = request.downloadHandler.text;
            byte[] buffer = Encoding.UTF8.GetBytes(msg);
            string sResult = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
            byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };
            if (buffer[0] == bomBuffer[0] && buffer[1] == bomBuffer[1] && buffer[2] == bomBuffer[2])
            {
                int copyLength = buffer.Length - 3;
                byte[] dataNew = new byte[copyLength];
                Buffer.BlockCopy(buffer, 3, dataNew, 0, copyLength);
                sResult = Encoding.UTF8.GetString(dataNew);
            }
            OnReceive?.Invoke(sResult);

            //OnReceive?.Invoke(request.downloadHandler.text);
        }
    }

    public void SendWebImage(string path, string webWrl)
    {
        StartCoroutine(loadWebImage(path, webWrl));
    }

    /// <summary>
    /// 从网上下载图片
    /// </summary>
    /// <param name="path">本地图片地址</param>
    /// <param name="webWrl">网址</param>
    /// <param name="name">图片名字</param>
    /// <returns></returns>
    IEnumerator loadWebImage(string path, string webWrl)
    {

        UnityWebRequest wr = new UnityWebRequest(webWrl);
        DownloadHandlerTexture texD1 = new DownloadHandlerTexture(true);
        wr.downloadHandler = texD1;
        //yield return wr.SendWebRequest();

        if (!wr.isNetworkError || !wr.isHttpError)
        {

            Texture2D tex = new Texture2D(10, 10);
            tex = texD1.texture;
            //保存本地
            Byte[] bytes = tex.EncodeToPNG();
            File.WriteAllBytes(path + "\\" + name, bytes);


            Debug.Log("下载完成");
            yield return tex;
        }
        else
        {
            Debug.LogError(wr.error);
            yield return null;
        }

    }

}

public delegate void OnReceiveDelegate(string data);

2.定义好要解析的json

/// <summary>
/// 图片的信息
/// </summary>
[Serializable]
public class PictrueContent
{
    /// <summary>
    /// 图片ID
    /// </summary>
    [SerializeField]
    public int id;
    /// <summary>
    /// 图片下载网址
    /// </summary>
    [SerializeField]
    public string url;
    /// <summary>
    /// 图片的名字
    /// </summary>
    [SerializeField]
    public string photo_name;

    /// <summary>
    /// 所属学校
    /// </summary>
    [SerializeField]
    public string university;
    /// <summary>
    /// 所属班级
    /// </summary>
    [SerializeField]
    public string banji;

    /// <summary>
    /// 毕业时间
    /// </summary>
    [SerializeField]
    public string graduation_date;

    /// <summary>
    /// 照片类型
    /// </summary>
    [SerializeField]
    public string type;


}
/// <summary>
/// 数据信息数组
/// </summary>
[Serializable]
public class PictrueData
{
    /// <summary>
    /// 照片信息
    /// </summary>
    [SerializeField]
    public PictrueContent[] data;
    /// <summary>
    /// 那种模式
    /// </summary>
    [SerializeField]
    public int mode;
    /// <summary>
    /// 信息数据
    /// </summary>
    [SerializeField]
    public int size;
    /// <summary>
    /// 总数
    /// </summary>
    [SerializeField]
    public int count;
    /// <summary>
    /// 页数
    /// </summary>
    [SerializeField]
    public int page;

}

注意:json通信传输,一定要序列化!  [SerializeField]

3.发送和接受网络端的信息


using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class ReadPictrueData : MonoBehaviour
{
    public static ReadPictrueData Instance;

    /// <summary>
    /// 从网络获取的数据
    /// </summary>
    public Queue<PictrueContent> jsonData = new Queue<PictrueContent>();
 

    private string wwwUrl;

    public Text TxtShow;

    public Text TxtShowData;


    void Start()
    {

        Instance = this;
        //DontDestroyOnLoad(this.gameObject);
        isScene = true;
        loadNumber = 0;

        WWWUrl.Instance.OnReceive += OnReceive;
        FaSong();
    }


    /// <summary>
    /// 监听网络返回的数据
    /// </summary>
    /// <param name="data"></param>
    private void OnReceive(string data)
    {

        if (WWWUrl.WebError != null)
        {
            TxtShowData.text = WWWUrl.WebError;
        }
        else
        {
            TxtShowData.text = data;
        }

        Debug.Log("收到的数据!" + data);

        PictrueData jsonTemp = JsonUtility.FromJson<PictrueData>(data);


        if (data.Contains("\"mode\":\"0\""))
        {
            for (int i = 0; i < jsonTemp.data.Length; i++)
            {
                //在队列的末端添加元素
                jsonData.Enqueue(jsonTemp.data[i]);

            }

        }

        }

    public void FaSong()
    {

//和服务端定义好各个数据的内容
        string url = string.Format(wwwUrl + "?mode={0}&university={1}&type={2}&graduation_date={3}&banji={4}&page={5}&size={6}", 0, null, "照片", null, null, loadNumber, 30);
        WWWUrl.Instance.SendWebMessage(url);

    }

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值