根据unity官方说的,

WebGL 网络无法直接访问套接字

由于存在安全隐患,JavaScript 代码无法直接访问 IP 套接字来实现网络连接。因此,.NET 网络类(即 System.Net 命名空间中的所有内容,具体而言就是 System.Net.Sockets)在 WebGL 中不起作用。Unity 旧有的 UnityEngine.Network* 类也是如此,以 WebGL 为构建目标时无法使用这些类。

如果需要在 WebGL 中使用网络,当前可选择的做法是使用 Unity 中的 WWW 或 UnityWebRequest 类或使用支持 WebGL 的新型 Unity 网络功能,或者使用 JavaScript 中的 WebSockets 或 WebRTC 来实现您自己的网络。

使用 WebGL 中的 WWW 或 WebRequest 类

WebGL 支持 WWW 和 UnityWebRequest 类。这些类是使用 JavaScript 中的 XMLHttpRequest 类实现的(使用浏览器来处理 WWW 请求)。这种情况下对访问跨域资源施加了一些安全限制。基本上,任何 WWW 请求若是发送到与托管 WebGL 内容的服务器不同的服务器,都需要由您尝试访问的服务器进行授权。为了在 WebGL 中访问跨域 WWW 资源,您尝试访问的服务器需要使用 CORS 对此访问进行授权。

上代码

using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
// TSingletonM是设置一个单例继承
public class UnityWebRequestHelp : TSingletonM<UnityWebRequestHelp>
{
    private string m_url = GameConfig.Url;
    public delegate void OnNetBackWeb(object eventObj);
    private void Awake()
    {
        Instance = this;
        // json解析的格式化添加
        LitJson.JsonMapper.RegisterImporter<long, int>((long input) => { return (int)input; });
        LitJson.JsonMapper.RegisterImporter<int, long>((int input) => { return (long)(input); });
    }
    public void SetUrl(string ip, int port)
    {
        m_url = @"http://" + ip + ":" + port;
    }

    /// 向服务器提交post请求

    public void SendPostData<T>(int cmd, object param, OnNetBackWeb actionResult)
    {
        UIManager.Instance.ShowLoading(true);
        RequestBaseData bas = new RequestBaseData();
        if (PropertyStatic.s_propUser.m_user.playerId != "")
        {
            bas.playerId = PropertyStatic.s_propUser.m_user.playerId;
            bas.sessionKey = PropertyStatic.s_propUser.m_sessionKey;
        }
        bas.setMessage(cmd, JsonMapper.ToJson(param));

        StartCoroutine(_Post<T>(JsonMapper.ToJson(bas), actionResult));

    }



    

    /// 向服务器提交post请求

    /// </summary>

    /// <param name="serverURL">服务器请求目标地址,like "http://www.my-server.com/myform"</param>

    /// <param name="lstformData">form表单参数</param>

    /// <param name="callback">处理返回结果的委托</param>

    /// <returns></returns>

    IEnumerator _Post<T>(string lstformData, OnNetBackWeb callback)

    {

        //List<IMultipartFormSection> formData = new List<IMultipartFormSection>();

        //formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));

        //formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));

        var request = new UnityWebRequest(m_url, "POST");
        byte[] bodyRaw = Encoding.UTF8.GetBytes(lstformData);
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
        request.SetRequestHeader("Content-Type", "application/json");

        DownloadHandler downloadHandler = new DownloadHandlerBuffer();
        request.downloadHandler = downloadHandler;

        request.timeout = 15;
        yield return request.SendWebRequest();

        if (request.downloadHandler.text == null|| request.downloadHandler.text == "")
        {
            UIManager.Instance.ShowLoading(false);
        }
        else
        {
            ResponseBaseData data = JsonMapper.ToObject<ResponseBaseData>(@request.downloadHandler.text);
            if (data.errorCode != 0)
            {

                string reason = "request error status: " + m_url + lstformData;
                Debug.LogError(reason);
                UIManager.Instance.ShowTips(data.errorCode.ToString());
            }
            else
            {
                if (data.sessionKey!="") PropertyStatic.s_propUser.m_sessionKey = data.sessionKey;

                if (data.sysMessage != null)
                {// 同步用户/心跳数据
                    if (callback != null) callback(data.sysMessage);
                }
                else
                {
                    // 格式化类型数据
                    T t = JsonMapper.ToObject<T>(data.message);
                    if (callback != null) callback(t);
                }
            }
            UIManager.Instance.ShowLoading(false);
        }


    }


}
[Serializable]
// 请求数据
public class RequestBaseData
{
    public int code;
    public int eId = 0;
    public int isCheck = 0;
    public string message;
    public string playerId;
    public int pwd = 0;
    public string sessionKey;
    public int version = 266;
    public void setMessage(int code1, string message1)
    {
        message = message1;
        code = code1;
    }
}


// 返回数据
[Serializable]
public class ResponseBaseData
{
    public string code { get; set; }
    public int errorCode { get; set; }
    public string execution { get; set; }
    public string message { get; set; }
    public SysMessage sysMessage { get; set; }
    public string time { get; set; }
    public string sessionKey { set; get; }//
}

调用方式 比如邮箱登录 

1.data的结构体是

public class RequestEmailLogin
{
    public string email;
    public string pwd;
    public RequestEmailLogin(string e, string p)
    {
        email = e;
        pwd = p;
    }
}

2.callback 是上面定义的UnityWebRequestHelp.OnNetBackWeb类型的委托

 UnityWebRequestHelp.Instance.SendPostData<SysMessage>(HttpCode.Email_Login, data, callback);

最后希望callback回来的数据解析成SysMessage类型的

void callback(object obj)

{

SysMessage a =  obj as SysMessage;// 就得到数据了

}

GitHub 加速计划 / js / json
18
5
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:2 个月前 )
960b763e 5 个月前
8c391e04 8 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐