public async Task <bool> Connect() { m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_socket.NoDelay = true; try { m_socket.Connect(NetworkConfigure.IP, NetworkConfigure.Port); Debug.Log("Connected."); } catch (System.Exception e) { Debug.Log(e.Message); } // m_buffer.SetSize(2048); // m_buffer.GenerateBuffer(); m_buffer.GenerateBufferWithSize(2048); new Thread(async() => { List <Socket> socketReadList = new List <Socket>(); try { while (m_socket.Connected) { socketReadList.Clear(); socketReadList.Add(m_socket); try { Socket.Select(socketReadList, null, null, 0); } catch (SocketException e) { Debug.Log(e.Message); Debug.Log(e.StackTrace); Debug.Log(e.ErrorCode); } catch (Exception e) { Debug.Log(e.ToString()); } // readable if (socketReadList.Count > 0) { var seg = new ArraySegment <byte>(m_buffer.GetBuffer(), m_buffer.Pointer, m_buffer.Remain); var recvLen = await m_socket.ReceiveAsync(seg, SocketFlags.None); m_buffer.Pointer += recvLen; bool result = false; do { result = m_buffer.Parse( segment => { var cmd = NetworkCommand.ParseFromByteArraySegment(segment); m_commandReadQueue.Enqueue(cmd); // Debug.Log($"recieved cmd : {cmd.CommandType}"); } ); } while (result); } // writable if (!m_commandWriteQueue.IsEmpty) { NetworkCommand command; var result = m_commandWriteQueue.TryDequeue(out command); if (result) { var buf = command.Format(); await m_socket.SendAsync(new ArraySegment <byte>(buf), SocketFlags.None); } } } } catch (Exception e) { Debug.Log(e.Message); Debug.Log(e.StackTrace); throw e; } }).Start(); // this.Send(new LoginRequestCommand("player1", "123456")); return(true); }