using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Mesnac.Basic
{
    public class SocketClient
    {
        public static Socket m_clientSocket;
        private byte[] m_receiveBuffer = new byte[1024];
        private IPEndPoint remoteEndPoint;
        public string receiveStr;
        public bool connFlag = false;

        public static string serverIp
        {
            get
            {
                return ConfigurationManager.AppSettings["ListenServerIP"];
            }
        }

        public static string serverPort
        {
            get
            {
                return ConfigurationManager.AppSettings["Port"];
            }
        }

        public SocketClient()
        {
            remoteEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt32(serverPort));
            m_clientSocket = new Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        }

        public bool Connect()
        {
            bool reC = false;
            try
            {
                IAsyncResult result = m_clientSocket.BeginConnect(remoteEndPoint, null, null);
                result.AsyncWaitHandle.WaitOne(500);

                //m_clientSocket.Connect(remoteEndPoint);

                if (m_clientSocket.Connected)
                {
                    reC = true;
                    connFlag = true;
                    m_clientSocket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
                }
            }
            catch
            {

            }
            finally
            {
                
            }

            return reC;
        }

        private void ReceiveCallBack(IAsyncResult ar)
        {
            try
            {
                int REnd = m_clientSocket.EndReceive(ar);
                string strReceiveData = Encoding.UTF8.GetString(m_receiveBuffer, 0, REnd);
                this.HandleMessage(strReceiveData);
                if (string.IsNullOrEmpty(strReceiveData))
                {
                    connFlag = false;
                }
                else
                {
                    m_clientSocket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
                }
                //m_clientSocket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
            }
            catch (Exception ex)
            {
                connFlag = false;
            }
        }

        /// <summary>
        /// 处理接收到的数据
        /// </summary>
        private void HandleMessage(string message)
        {
            message = message.Replace("/0", "");
            if (!string.IsNullOrEmpty(message))
            {
                receiveStr = message;
            }
        }

        /// <summary>
        /// 客户端尝试重连服务器端
        /// </summary>
        public void ReConnect()
        {
            try
            {
                if (m_clientSocket != null && m_clientSocket.Connected)
                {
                    m_clientSocket.Close();
                    m_clientSocket.Disconnect(false);
                    m_clientSocket = null;
                }
                m_clientSocket.Close();
                remoteEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt32(serverPort));
                m_clientSocket = new Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                this.Connect();
            }
            catch (System.Exception)
            {
                //logBundle.DBLog(App.FormName, 1, "网络已经断开", "");
            }
        }
    }
}