public static void MainLoop()
        {
            if (null == JClientSocket.socket)
            {
                JLog.Error("JClientDataReceiverThread.MainLoop JClientSocket.socket is null, please make sure JClientSocketManager is initialized. ", JGame.Log.JLogCategory.Network);
                return;
            }
            while (true)
            {
                if (_requireEnd)
                {
                    break;
                }

                if (JClientSocket.socket.Available <= 0)
                {
                    Thread.Sleep(100);
                    continue;
                }

                byte[] buffer = new byte[JTcpDefines.max_buffer_size];
                int    recLen = JClientSocket.socket.Receive(buffer);
                if (recLen > 0)
                {
                    JNetworkDataOperator.ReceiveData(recLen, buffer, JClientSocket.socket.RemoteEndPoint);
                }
                else
                {
                    //说明socket已经断开连接
                }
            }
        }
        private void ReceiveLoop()
        {
            JLog.Info("JServerSocketManager server receive loop started", JGame.Log.JLogCategory.Network);
            List <Socket> clientScokets = new List <Socket> ();

            while (true)
            {
                if (_forceEnd)
                {
                    break;
                }

                if (_semaphore.WaitOne(1))
                {
                    _semaphore = new Semaphore(0, 10000);
                    JLog.Info("JServerSocketManager ReceiveLoop _semaphore.WaitOne(1) success", JGame.Log.JLogCategory.Network);
                    lock (_socketLocker) {
                        foreach (Socket socket in JConnectedClientSocket.sockets)
                        {
                            clientScokets.Add(socket);
                        }
                        JLog.Info("JServerSocketManager ReceiveLoop add socket to clientsockets: count : " + clientScokets.Count.ToString(), JGame.Log.JLogCategory.Network);
                    }

                    JLog.Debug("connected client sockets : " + clientScokets.Count.ToString(), JGame.Log.JLogCategory.Network);
                }
                if (clientScokets.Count == 0)
                {
                    _semaphore.WaitOne();
                    _semaphore.Release();

                    JLog.Debug("JServerSocketManager ReceiveLoop._semaphore.WaitOne success. ", JGame.Log.JLogCategory.Network);

                    continue;
                }

                //JLog.Debug ("JServerSocketManager ReceiveLoop.Socket.Select begin Socket.Select clientsocket:count :" + clientScokets.Count.ToString (), JGame.Log.JLogCategory.Network);
                Socket.Select(clientScokets, null, null, 10000);
                if (clientScokets.Count > 0)
                {
                    JLog.Debug("JServerSocketManager ReceiveLoop.Socket.Select selected clientsockets: count : " + clientScokets.Count.ToString(), JGame.Log.JLogCategory.Network);
                }

                List <Socket> disconnectedSockets = new List <Socket>();
                foreach (Socket socket in clientScokets)
                {
                    /*if (socket.Available <= 0)
                     *      continue;*/

                    //如果接收到了新的消息就重置包时间
                    lock (_heartbeatLocker)
                    {
                        if (_socketHeartDelayTime.ContainsKey(socket))
                        {
                            _socketHeartDelayTime [socket] = JTime.CurrentTime;
                        }
                        else
                        {
                            _socketHeartDelayTime.Add(socket, JTime.CurrentTime);
                        }
                    }

                    //receive form client socket
                    bool bReceivedSuccess = false;
                    if (socket.Connected)
                    {
                        try {
                            byte[] recBuffer = new byte[JTcpDefines.max_buffer_size];
                            JLog.Info("try to receive from socket : " + (socket.RemoteEndPoint as IPEndPoint).Address.ToString(), JGame.Log.JLogCategory.Network);
                            int recLen = socket.Receive(recBuffer);
                            if (recLen > 0)
                            {
                                JLog.Info("receive one packet from client : IP" + (socket.RemoteEndPoint as IPEndPoint).Address.ToString() + " len:" + recLen.ToString(), JGame.Log.JLogCategory.Network);
                                //save the received data
                                JNetworkDataOperator.ReceiveData(recLen, recBuffer, socket.RemoteEndPoint);

                                //add the selected socket to select sockets list
                                //clientScokets.Add(socket);

                                bReceivedSuccess = true;
                            }
                        } catch (Exception e) {
                            JLog.Error("JServerSocketManager ReceiveLoop exception reveive error message:" + e.Message, JGame.Log.JLogCategory.Network);
                        }
                    }

                    try
                    {
                        if (!bReceivedSuccess)
                        {
                            //client disconnect
                            if (socket.Connected)
                            {
                                socket.Close();
                            }
                            //record disconnected socket from list
                            disconnectedSockets.Add(socket);

                            JLog.Info("client socket disconnected : " + socket.RemoteEndPoint.ToString(), JGame.Log.JLogCategory.Network);
                        }
                    }
                    catch (Exception e) {
                        JLog.Error("JServerSocketManager ReceiveLoop exception error message1:" + e.Message, JGame.Log.JLogCategory.Network);
                    }
                }

                try
                {
                    //remove disconnected socket form list
                    if (disconnectedSockets.Count > 0)
                    {
                        lock (_socketLocker) {
                            foreach (Socket socket in disconnectedSockets)
                            {
                                JConnectedClientSocket.sockets.Remove(socket);
                                clientScokets.Remove(socket);
                            }
                        }
                    }


                    //add old sockets to client sockets
                    lock (_socketLocker) {
                        foreach (Socket socket in JConnectedClientSocket.sockets)
                        {
                            clientScokets.Add(socket);
                        }
                    }
                }
                catch (Exception e) {
                    JLog.Error("JServerSocketManager ReceiveLoop exception error message2:" + e.Message, JGame.Log.JLogCategory.Network);
                }
            }

            JLog.Info("JServerSocketManager server receive loop end.", JGame.Log.JLogCategory.Network);
        }