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