using System.Collections; using UnityEngine; using UnityEngine.Events; using QFrameworkCP; using System.Threading; using UnityEngine.UI; using System; namespace JXSoft { public class TCPMangerArchitecture : Architecture { protected override void Init() { this.RegisterUtility(new TCPClientUtility()); this.RegisterModel(new TCPClientModel()); } } public class TCPClientView : MonoBehaviour,IController,ICanRegisterEvent { public string tcpAddress; public int tcpPort; //Printer&MsgGetter private TCPClientUtility tcpUtil; public Transform tcpMsgContent; public GameObject tcpMsgItem; public UnityEvent onRecievedOpenDevice; public UnityEvent onTCPLinkSuccess; public UnityEvent onTCPLinkFaild; public UnityEvent onServerConnected; public UnityEvent onTCPReLink; private int deviceId; // Start is called before the first frame update void Awake() { initTCPService(); DontDestroyOnLoad(this); tcpUtil = GetArchitecture().GetUtility(); } public void initTCPService() { deviceId = 1; this.RegisterLinkStateEvent((int)TCPLinkState.Linking, () => { Debug.Log("TCP开始链接"); this.GetModel().linkServer(); }); this.RegisterLinkStateEvent((int)TCPLinkState.LinkSucess, () => { Debug.Log("TCP链接成功"); onTCPLinkSuccess.Invoke(); }); this.RegisterLinkStateEvent((int)TCPLinkState.LinkFaild, () => { Debug.Log("TCP连接失败,请联系设备服务管理员"); onTCPLinkFaild.Invoke(); }); this.GetModel().setLinkState((int)TCPLinkState.NoIp); this.GetModel().setIP(tcpAddress, tcpPort); } public void restartTCPService() { onTCPReLink.Invoke(); this.GetModel().closeServer(); StartCoroutine(waitTwoSecond()); } public IEnumerator waitTwoSecond() { yield return new WaitForSeconds(2.0f); this.GetModel().setLinkState((int)TCPLinkState.Linking); } // Update is called once per frame void Update() { //Debug.Log(tcpUtil.Read_TCPClient()); if (tcpUtil != null && !"".Equals(tcpUtil.getReceivedValue())) { GameObject item = Instantiate(tcpMsgItem, tcpMsgContent); item.GetComponentInChildren().text = tcpUtil.receivedData; this.GetModel().onDataRecived.Invoke(tcpUtil.receivedData); } if (tcpUtil.getTimeOutState() && tcpUtil.isOpenTCP) { this.SendEvent(new onLinkException(tcpUtil.exceptionData)); tcpUtil.isOpenTCP = false; } } private void OnDestroy() { if (tcpUtil.reciveT != null && tcpUtil.reciveT.ThreadState == ThreadState.Running) { tcpUtil.reciveT.Abort(); } } public IArchitecture GetArchitecture() { return TCPMangerArchitecture.Interface; } } public interface ITCPClient { } public static class TCPClientExtention { public static IUnRegister RegisterMessageEvent(this ITCPClient self, Action onEvent) where TResponse : IResponse { return TCPMangerArchitecture.Interface.RegisterEvent(e => { if (e.res.GetType() == typeof(TResponse)) { onEvent.Invoke((TResponse)e.res); } }); } public static void onReceive(this ITCPClient self) where TResponse : IResponse, new() { TCPMangerArchitecture.Interface.GetModel().onReceive(); } public static void offReceive(this ITCPClient self) where TResponse : IResponse, new() { TCPMangerArchitecture.Interface.GetModel().offReceive(); } public static void sendRequest(this ITCPClient self ,TRequest request) where TRequest : IRequest, new() { TCPMangerArchitecture.Interface.GetModel().sendRequest(request); } } }