Example #1
0
    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);
    }