| | |
| | | |
| | | public void Connect(string _ip, int _port, Action<bool> _onConnected) |
| | | { |
| | | Debug.unityLogger.logEnabled = true; |
| | | try |
| | | { |
| | | ip = _ip; |
| | | port = _port; |
| | | onConnected = _onConnected; |
| | | Debug.Log($"[ClientSocket][Connect] 尝试连接: ip={_ip}, port={_port}"); |
| | | //目前测试到异步两个问题 |
| | | // 1. BeginGetHostAddresses 不明情况下会很久才回调,导致触发超时 |
| | | // 2. 超时的情况下多次尝试登录后,会触发多次OnGetHostAddresses,导致登录异常 |
| | |
| | | ipAddress = ipAddresses[0]; |
| | | #endif |
| | | |
| | | |
| | | Debug.Log($"[ClientSocket][Connect] 解析到ipAddress={ipAddress}, family={ipAddress.AddressFamily}"); |
| | | if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) |
| | | { |
| | | Debug.Log("当前使用的网络: IPV6"); |
| | | Debug.Log("[ClientSocket][Connect] 当前使用的网络: IPV6"); |
| | | m_Socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); |
| | | } |
| | | else |
| | | { |
| | | Debug.Log("当前使用的网络: IPV4"); |
| | | Debug.Log("[ClientSocket][Connect] 当前使用的网络: IPV4"); |
| | | m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
| | | } |
| | | |
| | | var ipEndPoint = new IPEndPoint(ipAddress, port); |
| | | if (ipEndPoint == null) |
| | | { |
| | | Debug.Log("IpEndPoint is null"); |
| | | Debug.LogError("[ClientSocket][Connect] IpEndPoint is null"); |
| | | } |
| | | |
| | | m_Socket.BeginConnect(ipEndPoint, new AsyncCallback(ConnectCallBack), null); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Debug.LogError(e.Message); |
| | | Debug.LogError($"[ClientSocket][Connect] 异常: {e.Message}"); |
| | | } |
| | | |
| | | |
| | |
| | | /// <param name="_result"></param> |
| | | private void ConnectCallBack(IAsyncResult _result) |
| | | { |
| | | Debug.unityLogger.logEnabled = true; |
| | | if (!_result.IsCompleted) |
| | | { |
| | | Debug.Log("链接超时!"); |
| | | Debug.LogError("[ClientSocket][ConnectCallBack] 链接超时!"); |
| | | CloseConnect(); |
| | | if (onConnected != null) |
| | | { |
| | | Debug.LogError("[ClientSocket][ConnectCallBack] onConnected(false) 超时"); |
| | | onConnected(false); |
| | | onConnected = null; |
| | | } |
| | |
| | | { |
| | | if (m_Socket != null && m_Socket.Connected) |
| | | { |
| | | Debug.Log("确认的链接实现"); |
| | | Debug.Log("[ClientSocket][ConnectCallBack] 确认的链接实现"); |
| | | OnConnectSuccess(); |
| | | } |
| | | else |
| | | { |
| | | Debug.LogError("[ClientSocket][ConnectCallBack] m_Socket为null或未连接"); |
| | | if (m_Socket != null) |
| | | { |
| | | m_Socket.Disconnect(true); |
| | |
| | | } |
| | | catch (System.Exception ex) |
| | | { |
| | | Debug.Log(ex); |
| | | Debug.LogError($"[ClientSocket][ConnectCallBack] 异常: {ex}"); |
| | | } |
| | | finally |
| | | { |
| | | if (onConnected != null) |
| | | { |
| | | Debug.Log($"[ClientSocket][ConnectCallBack] onConnected({{0}})", m_Socket != null && m_Socket.Connected); |
| | | onConnected(m_Socket != null && m_Socket.Connected); |
| | | onConnected = null; |
| | | } |
| | |
| | | public void CloseConnect() |
| | | { |
| | | Debug.Log("==== CloseConnect"); |
| | | Debug.unityLogger.logEnabled = true; |
| | | Debug.Log("[ClientSocket][CloseConnect] ==== CloseConnect"); |
| | | try |
| | | { |
| | | isStopTreading = true; |
| | |
| | | { |
| | | if (m_packageThread != null) |
| | | { |
| | | m_packageThread.Abort(); |
| | | m_packageThread = null; |
| | | } |
| | | |
| | | m_LastPackageTime = DateTime.Now; |
| | | m_packageThread = new Thread(new ThreadStart(ReceiveInfo)); // 启动线程接收信息 |
| | | m_packageThread.IsBackground = true; |
| | | m_packageThread.Start(); |
| | | isStopTreading = false; |
| | | Debug.unityLogger.logEnabled = true; |
| | | Debug.Log("[ClientSocket][OnConnectSuccess] 连接成功,启动接收线程"); |
| | | if (m_packageThread != null) |
| | | { |
| | | Debug.LogWarning("[ClientSocket][OnConnectSuccess] m_packageThread已存在,先Abort"); |
| | | m_packageThread.Abort(); |
| | | m_packageThread = null; |
| | | } |
| | |
| | | Debug.Log(e); |
| | | } |
| | | } |
| | | Debug.unityLogger.logEnabled = true; |
| | | Debug.Log("[ClientSocket][ReceiveInfo] 接收线程启动"); |
| | | while (!isStopTreading) |
| | | { |
| | | try |
| | | { |
| | | var shutdown = false; |
| | | if (!m_Socket.Connected) |
| | | { |
| | | Debug.LogWarning("[ClientSocket][ReceiveInfo] m_Socket 已断开"); |
| | | shutdown = true; |
| | | } |
| | | |
| | | if (!shutdown) |
| | | { |
| | | var dataLength = m_Socket.Receive(bufferBytes); |
| | | Debug.Log($"[ClientSocket][ReceiveInfo] 收到数据长度: {dataLength}"); |
| | | if (dataLength <= 0) |
| | | { |
| | | Debug.LogWarning("[ClientSocket][ReceiveInfo] dataLength <= 0,准备断开"); |
| | | shutdown = true; |
| | | } |
| | | else |
| | | { |
| | | getBytesTotal += dataLength; |
| | | var bytes = new byte[dataLength]; |
| | | Array.Copy(bufferBytes, 0, bytes, 0, dataLength); |
| | | ReadInfo(bytes); |
| | | } |
| | | } |
| | | |
| | | if (shutdown) |
| | | { |
| | | Debug.LogWarning("[ClientSocket][ReceiveInfo] shutdown=true,关闭Socket"); |
| | | isStopTreading = true; |
| | | m_Socket.Shutdown(SocketShutdown.Both); |
| | | m_Socket.Close(); |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Debug.LogError($"[ClientSocket][ReceiveInfo] 异常: {e}"); |
| | | } |
| | | } |
| | | Debug.Log("[ClientSocket][ReceiveInfo] 接收线程退出"); |
| | | |
| | | } |
| | | |
| | |
| | | if (fragmentBytes != null && fragmentBytes.Length > 0) |
| | | { |
| | | Array.Resize(ref fixBytes, vBytes.Length + fragmentBytes.Length); |
| | | Debug.Log($"[ClientSocket][ReadInfo] 存在fragmentBytes, 长度: {fragmentBytes.Length}"); |
| | | Array.Copy(fragmentBytes, 0, fixBytes, 0, fragmentBytes.Length); |
| | | Array.Copy(vBytes, 0, fixBytes, fragmentBytes.Length, vBytes.Length); |
| | | } |
| | |
| | | |
| | | public async void Connect(string _ip, int _port, Action<bool> _onConnected) |
| | | { |
| | | Debug.unityLogger.logEnabled = true; |
| | | ip = _ip; |
| | | port = _port; |
| | | onConnected = _onConnected; |
| | |
| | | |
| | | public async void CloseConnect() |
| | | { |
| | | Debug.Log("[ClientSocket-WebSocket] ==== CloseConnect"); |
| | | Debug.Log("[ClientSocket-WebSocket] ==== CloseConnect\n" + System.Environment.StackTrace); |
| | | fragmentBytes = null; |
| | | |
| | | if (webSocket != null) |