using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using QFrameworkCP; using System; using UnityEngine.UI; using System.Threading; namespace JXSoft { public class UDPMangerArchitecture : Architecture { protected override void Init() { this.RegisterUtility(new UDPUtility()); this.RegisterModel(new UDPClientModel()); } } public class UDPClientView : MonoBehaviour, IController { public UnityEvent onRecievedOpenDevice; public UnityEvent onUDPLinkSuccess; public UnityEvent onUDPLinkFaild; public UnityEvent onServerConnected; public UnityEvent onUDPReLink; private string UDPAddress; private int UDPPort; private int deviceId; private UDPUtility udpUtil; public Transform udpMsgContent; public GameObject udpMsgItem; public InputField InputSendMsg; // Start is called before the first frame update void Awake() { initUDPService(); DontDestroyOnLoad(this); } void Start() { udpUtil = GetArchitecture().GetUtility(); } // Update is called once per frame void Update() { if (udpUtil != null && !"".Equals(udpUtil.getReceivedValue())) { GameObject item = Instantiate(udpMsgItem, udpMsgContent); item.GetComponentInChildren().text = udpUtil.receivedData; this.GetModel().onDataRecived.Invoke(udpUtil.receivedData); } if (udpUtil.getTimeOutState() && udpUtil.isOpenUDP) { this.SendEvent(new onUDPLinkException(udpUtil.exceptionData)); udpUtil.isOpenUDP = false; } } private void OnDestroy() { if (udpUtil.reciveT != null && udpUtil.reciveT.ThreadState == ThreadState.Running) { udpUtil.reciveT.Abort(); } } public void sendMsg() { this.GetUtility().sendData(InputSendMsg.text); } public void initUDPService() { UDPAddress = "127.0.0.1"; UDPPort = 20000; deviceId = 1; GetArchitecture().RegisterEvent(e => { if (e.state == UDPLinkState.Linking) { Debug.Log("UDP开始链接"); this.GetModel().linkServer(); } if (e.state == UDPLinkState.LinkSucess) { Debug.Log("UDP链接成功"); onUDPLinkSuccess.Invoke(); } if (e.state == UDPLinkState.LinkFaild) { Debug.Log("UDP连接失败,请联系设备服务管理员"); onUDPLinkFaild.Invoke(); } }); this.GetModel().setLinkState((int)UDPLinkState.NoIp); this.GetModel().setIP(UDPAddress, UDPPort); } public void restartUDPService() { onUDPReLink.Invoke(); this.GetModel().closeServer(); StartCoroutine(waitTwoSecond()); } public IEnumerator waitTwoSecond() { yield return new WaitForSeconds(2.0f); this.GetModel().setLinkState((int)UDPLinkState.Linking); } public IArchitecture GetArchitecture() { return UDPMangerArchitecture.Interface; } } }