По словам представителя единства,
Сеть WebGL не может напрямую обращаться к сокетам
Из соображений безопасности код JavaScript не может напрямую обращаться к IP-сокетам для сетевых подключений. Поэтому сетевые классы .NET (то есть System.Net
все в пространстве имен, в частности System.Net.Sockets
) не будут работать в WebGL. То же самое касается устаревших классов Unity UnityEngine.Network*
, которые нельзя использовать при ориентации на WebGL.
Если вам нужно использовать сеть в WebGL, вы можете использовать классы WWW
или в Unity, использовать новые сетевые функции UnityUnityWebRequest
, поддерживающие WebGL , или реализовать собственную сеть с помощью WebSockets или WebRTC в JavaScript.
Использование классов WWW или WebRequest в WebGL
WebGL поддерживает классы WWW и UnityWebRequest . XMLHttpRequest
Эти классы реализованы с использованием классов в JavaScript (с использованием браузера для обработки запросов WWW). Этот сценарий накладывает некоторые ограничения безопасности на доступ к ресурсам из разных источников. По сути, любой запрос WWW к серверу, отличному от того, на котором размещен контент WebGL, должен быть авторизован сервером, к которому вы пытаетесь получить доступ. Чтобы получить доступ к ресурсам WWW из разных источников в WebGL, сервер, к которому вы пытаетесь получить доступ, должен авторизовать этот доступ с помощью 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. Структура данных
общедоступный класс RequestEmailLogin
{ электронная почта общедоступной строки; общедоступная строка pwd; public RequestEmailLogin (строка e, строка p) { электронная почта = e; рвд = р; } }
2. обратный вызов является делегатом типа UnityWebRequestHelp.OnNetBackWeb, определенного выше.
UnityWebRequestHelp.Instance.SendPostData<SysMessage>(HttpCode.Email_Login, данные, обратный вызов);
Наконец, я надеюсь, что данные, возвращаемые обратным вызовом, будут преобразованы в тип SysMessage.
недействительный обратный вызов (объект объект)
{
SysMessage a = obj as SysMessage;// получаем данные
}