using Apewer;
using Apewer.Internals;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Apewer.Network
{

    /// <summary>TCP 客户端。</summary>
    public class TcpClient : IDisposable
    {

        Socket _client = null;

        /// <summary>套接字实例。</summary>
        public Socket Socket { get => _client; }

        /// <summary>已连接。</summary>
        public bool Connected { get => _client != null && _client.Connected; }

        /// <summary>启动客户端,并连接到服务端。</summary>
        public TcpClient(string ip, int port) : this(IPAddress.Parse(ip), port) { }

        /// <summary>启动客户端,并连接到服务端。</summary>
        public TcpClient(IPAddress address, int port) : this(new IPEndPoint(address, port)) { }

        /// <summary>启动客户端,并连接到服务端。</summary>
        public TcpClient(IPEndPoint endpoint)
        {
            _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _client.Connect(endpoint);
            _client.SendTimeout = 5000;
        }

        /// <summary>关闭连接,释放系统资源。</summary>
        public void Dispose()
        {
            try { _client.Disconnect(false); } catch { }
            try { _client.Close(100); } catch { }
#if !NET20
            try { _client.Dispose(); } catch { }
#endif
        }

        /// <summary>接收。</summary>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="SocketException"></exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="System.Security.SecurityException"></exception>
        public byte[] Receive(int maxLength = 1024) => _client.Receive(maxLength);

        /// <summary>发送。</summary>
        /// <exception cref="ArgumentNullException" />
        /// <exception cref="SocketException" />
        /// <exception cref="ObjectDisposedException" />
        public void Send(byte[] data) => _client.Send(data);

    }

}