using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text.RegularExpressions; using UnityEngine; public class NetMain : SingleTon { private Socket socket; private IPEndPoint ipe; private string ip; private int port; public Socket conn() { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ip = "122.112.171.137"; port = 85; ipe = new IPEndPoint(IPAddress.Parse(ip), port); socket.Connect(ipe); if (socket.Connected) { Debug.Log("连接成功"); } else { Debug.LogError("连接失败"); } return socket; } public Socket Create(string serverAddress, int nPort) { string connectionHost = serverAddress; string convertedHost = string.Empty; AddressFamily convertFamily = AddressFamily.InterNetwork; if (IsIPAddress(serverAddress)) { GetIPType(serverAddress, out convertedHost, out convertFamily); if (string.IsNullOrEmpty(convertedHost)) { connectionHost = convertedHost; } } else { convertedHost = GetIPAddress(serverAddress, EAddressFam.IPv6); if (string.IsNullOrEmpty(convertedHost)) { convertedHost = GetIPAddress(serverAddress, EAddressFam.IPv4); } else { convertFamily = AddressFamily.InterNetworkV6; } if (string.IsNullOrEmpty(convertedHost)) { return null; } else { connectionHost = convertedHost; } } IPAddress[] ipAddressArray = Dns.GetHostAddresses(connectionHost); if (ipAddressArray.Length <= 0) { return null; } IPAddress ipAddress = ipAddressArray[0]; AddressFamily addressFamily = AddressFamily.InterNetwork; if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) { addressFamily = AddressFamily.InterNetworkV6; } Socket socket = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = 3000, ReceiveTimeout = 3000, SendBufferSize = 64 * 1024, ReceiveBufferSize = 64 * 1024, NoDelay = true }; return socket; } #region IPv6 #if (UNITY_IOS || UNITY_IPHONE) && !UNITY_EDITOR private static extern string getIPv6(string host); #endif string GetIPv6(string host) { #if (UNITY_IOS || UNITY_IPHONE) && !UNITY_EDITOR return getIPv6(host); #else return host + "&&ipv4"; #endif } void GetIPType(string serverIp, out string newServerIp, out AddressFamily IPType) { IPType = AddressFamily.InterNetwork; newServerIp = serverIp; try { string ipv6 = GetIPv6(serverIp); if (!string.IsNullOrEmpty(ipv6)) { string[] tmp = System.Text.RegularExpressions.Regex.Split(ipv6, "&&"); if (null != tmp && tmp.Length >= 2) { string type = tmp[1]; if (type == "ipv6") { newServerIp = tmp[0]; IPType = AddressFamily.InterNetworkV6; } } } } catch (Exception) { throw; } } string GetIPAddress(string hostName, EAddressFam af) { //基础操作系统和网络适配器是否支持 internet 协议的版本 6(ipv6) if (af == EAddressFam.IPv6 && !Socket.OSSupportsIPv6) { return null; } if (string.IsNullOrEmpty(hostName)) { return null; } string connetIP = string.Empty; IPHostEntry host; try { host = Dns.GetHostEntry(hostName); foreach (var ip in host.AddressList) { if (af == EAddressFam.IPv4) { if (ip.AddressFamily == AddressFamily.InterNetwork) { connetIP = ip.ToString(); } } else if (af == EAddressFam.IPv6) { if (ip.AddressFamily == AddressFamily.InterNetworkV6) { connetIP = ip.ToString(); } } } } catch (Exception e) { Debug.LogError("GetIPAddress error : " + e.Message); } return connetIP; } //判断str是域名还是ip bool IsIPAddress(string str) { Match match = Regex.Match(str, @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); return match.Success; } #endregion } //NetMain net = new NetMain("122.112.171.137", 443); //Socket _tcpClient = NetMain.Instance.conn(); //byte[] data = new byte[1024]; //int length = _tcpClient.Receive(data); //var message = Encoding.UTF8.GetString(data, 0, length); //Debug.Log("客户端收到来自服务器发来的信息" + message); //IPAddress ip2 = IPAddress.Parse("122.112.171.137");//所用网卡 //int port2 = 443;//监听端口 //IPEndPoint ipe2 = new IPEndPoint(ip2, port2); //EndPoint ep2 = (EndPoint)ipe2; //_tcpClient.Bind(ep2); //string msg = "/api/cases/base/list"; //byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制 //_tcpClient.Send(buffer); //TcpClient client = new TcpClient();//client是服务端的变量 //try //{ // //与服务端建立一个TCP连接,连接好以后,客户端就会等待服务端发来的数据 // client.Connect(IPAddress.Parse("122.112.171.137"), 443); //} //catch (Exception ex) //{ // Debug.Log("客户端连接异常:" + ex.Message); //} ////客户端接收服务端发送的数据部分 //var socket = NetMain.Instance; //const int bufferSize = 8792; //NetworkStream streamToClient = client.GetStream();//获得来自服务端的流 //byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组 //int byteRead = streamToClient.Read(buffer, 0, bufferSize);//将数据存入缓存中 //string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法 //Debug.Log("接收消息:" + msg); //Socket _tcpClient = NetMain.Instance.conn(); //string msg = "/api/cases/base/list"; //byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制 //_tcpClient.Send(buffer); //string url = "http://122.112.171.137:8080/api/cases/base/list"; //StartCoroutine(PostRequest(url)); //StartCoroutine(Get(url)); //streamToClient.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入客户端的流中并发送 //IEnumerator PostRequest(string url) //{ // //所提交的表单 // WWWForm form = new WWWForm(); // //加上请求参数,如参数名“Content-Type",内容”application/json“ // //form.AddField("Content-Type", "application/json"); // //发送Post请求 // using (UnityWebRequest webRequest = UnityWebRequest.Post(url, form)) // { // yield return webRequest.SendWebRequest(); // if (!string.IsNullOrEmpty(webRequest.error)) // { // Debug.LogError(webRequest.error); // } // else // { // //获得返回数据 // Debug.Log(webRequest.downloadHandler.text); // } // } //} enum EAddressFam : byte { IPv4, IPv6 }