根据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;//?就得到数据了
}
|