using QFrameworkCP; using UnityEngine; using System; using System.Text; using System.Net.Sockets; using System.IO; using System.Threading.Tasks; using System.Threading; using System.Net.NetworkInformation; namespace JXSoft { public class TCPUtility : IUtility { public string tcpAddress; public int tcpPort; public TcpClient tcpClient; public NetworkStream sendStream; public bool isOpenTCP = false; public bool isReceivedValue = false; public string receivedData = ""; public string exceptionData = ""; public Thread reciveT; public bool isTimeOut = false; public TCPUtility() { Debug.LogWarning("使用无参数构造tcp时,需要手动开启tcp服务"); } public TCPUtility(string tcpAddress, int tcpPort) { this.tcpAddress = tcpAddress; this.tcpPort = tcpPort; this.isTimeOut = false; StartTCPClient(); } public bool StartTCPClient() { isTimeOut = false; if (!isOpenTCP) { try { tcpClient = new TcpClient(tcpAddress, tcpPort); sendStream = tcpClient.GetStream(); } catch (Exception e) { exceptionData = e.ToString(); return false; } isOpenTCP = true; reciveT = new Thread(RecciveMsg); reciveT.IsBackground = true; reciveT.Start(); return true; } return false; } public bool StartTCPClient(string ip, int port) { isTimeOut = false; if (!isOpenTCP) { tcpAddress = ip; tcpPort = port; try { tcpClient = new TcpClient(tcpAddress, tcpPort); sendStream = tcpClient.GetStream(); } catch (Exception e) { exceptionData = e.ToString(); return false; } isOpenTCP = true; reciveT = new Thread(RecciveMsg); reciveT.IsBackground = true; reciveT.Start(); return true; } return false; } public void CloseTCPClient() { if (tcpClient.Connected) { sendStream.Close(); tcpClient.Close(); isOpenTCP = false; reciveT.Abort(); } } public void sendData(string data) { if (isOpenTCP == false) return; byte[] sendBytes = Encoding.Default.GetBytes(data); sendStream.Write(sendBytes, 0, sendBytes.Length); } public void RecciveMsg() { byte[] receiveBuff = new byte[1024]; int reviceLength = 0; string msg = ""; while (isOpenTCP) { try { reviceLength = tcpClient.Client.Receive(receiveBuff); msg = Encoding.UTF8.GetString(receiveBuff, 0, reviceLength); if (msg != "") { receivedData = msg; isReceivedValue = true; } } catch (Exception e) { Debug.LogWarning(e); //断线发送异常 isTimeOut = true; exceptionData = e.ToString(); break; } } Debug.Log("------------end While-------------"); } /// /// 线程接收到消息后 /// /// 接收到的消息 public string getReceivedValue() { if (isReceivedValue) { isReceivedValue = false; return receivedData; } else { return ""; } } public bool getTimeOutState() { return isTimeOut; } public bool IsReceivedMsg() { return sendStream.Length != 0; } public bool IsConnected() { return tcpClient.Connected; } /// /// 获取本机IP /// /// string :ip地址 public string GetIP() { string output = ""; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211; //无线局域网适配器 if ((item.NetworkInterfaceType == _type1) && item.OperationalStatus == OperationalStatus.Up) { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { output = ip.Address.ToString(); } } } } return output; } } }