/// <summary>
 /// Detach the given client from the server management
 /// </summary>
 /// <param name="clientSocket">the client to detach</param>
 /// <returns></returns>
 public bool DetachClient(ParallelSocket clientSocket)
 {
     lock (m_listLock)
     {
         return m_socketMap.Remove(clientSocket.Guid);
     }
 }
        /// <summary>
        /// Receive callback
        /// </summary>
        /// <param name="socket">client socket</param>
        /// <param name="receivedPacket">received packet</param>
        public void OnReceived(INetworkSocket socket, Packet receivedPacket)
        {
            ParallelPacket receivedParallelPacket = new ParallelPacket(receivedPacket);
            switch (receivedParallelPacket.GetPacketType())
            {
                case ParallelPacketType.IDENTITY_RESPONSE:
                    PacketSerializer<IdentityResponse> serializer = new PacketSerializer<IdentityResponse>(receivedParallelPacket.GetPacketRaw(),receivedParallelPacket.GetHeaderSize(),receivedParallelPacket.GetDataByteSize());

                    Guid guid = serializer.GetPacket().m_guid;
                    lock (m_listLock)
                    {
                        if (m_socketMap.ContainsKey(guid))
                        {
                            m_socketMap[guid].AddSocket(socket);
                        }
                        else
                        {
                            IParallelSocketCallback socketCallback = CallBackObj.OnAccept(this, socket.IPInfo);
                            if (socketCallback != null)
                            {
                                // Create new Parallel Socket
                                ParallelSocket parallelSocket = new ParallelSocket(guid,socket, this);
                                parallelSocket.CallBackObj = socketCallback;
                                parallelSocket.Start();
                                m_socketMap[guid] = parallelSocket;
                            }
                            else
                            {
                                // Rejected by server
                                socket.Disconnect();
                            }
                        }
                    }
                    break;
                default:
                    // Invalid protocol
                    socket.Disconnect();
                    break;
            }
        }
 /// <summary>
 /// Receive callback
 /// </summary>
 /// <param name="socket">client socket</param>
 /// <param name="receivedPacket">received packet</param>
 public void OnReceived(INetworkSocket socket, Packet receivedPacket)
 {
     ParallelPacket receivedParallelPacket = new ParallelPacket(receivedPacket);
     switch (receivedParallelPacket.PacketType)
     {
         case ParallelPacketType.IDENTITY_RESPONSE:
             PacketSerializer<IdentityResponse> serializer = new PacketSerializer<IdentityResponse>(receivedParallelPacket.PacketRaw,receivedParallelPacket.HeaderSize,receivedParallelPacket.DataByteSize);
             IdentityResponse response = serializer.ClonePacketObj();
             Guid guid = response.m_guid;
             int streamCount = response.m_streamCount;
             lock (m_listLock)
             {
                 if (m_socketMap.ContainsKey(guid))
                 {
                     m_socketMap[guid].AddSocket(socket);
                 }
                 else
                 {
                     if (CallBackObj == null)
                     {
                         socket.Disconnect();
                         return;
                     }
                     
                     if (Acceptor.OnAccept(this, socket.IPInfo, streamCount))
                     {
                         // Create new Parallel Socket
                         IParallelSocketCallback socketCallback = Acceptor.GetSocketCallback();
                         ParallelSocket parallelSocket = new ParallelSocket(guid,socket, this);
                         parallelSocket.CallBackObj = socketCallback;
                         parallelSocket.Start();
                         m_socketMap[guid] = parallelSocket;
                         OnParallelServerAccepted(this, parallelSocket);
                     }
                     else
                     {
                         // Rejected by server
                         socket.Disconnect();
                     }
                 }
             }
             break;
         default:
             // Invalid protocol
             socket.Disconnect();
             break;
     }
 }