void c2s_stub_OnReqLogout(NetIncomingMessage im, C2S.Message.ReqLogout data)
        {
            ConnectedUser user = client_list[im.SenderConnection];

            if (user == null)
            {
                user = idx_id_for_client_list[data.id];
            }
            if (user == null)
            {
                im.SenderConnection.Disconnect("You are not logged in.");
                return;
            }

            client_list.Remove(im.SenderConnection);
            idx_id_for_client_list.Remove(data.id);

            if (user.connection != null)
            {
                s2c_proxy.NotifyLogout(user.connection, user.id);
            }

            foreach (var client in client_list.Values)
            {
                s2c_proxy.NotifyLogout(client.connection, user.id);
            }

            Console.WriteLine("{0} logout from {1}.", user.id, im.SenderEndPoint.ToString());
        }
        void c2s_stub_OnHeartbeat(NetIncomingMessage im, C2S.Message.Heartbeat data)
        {
            //Console.WriteLine("OnHeartbeat...[ThreadID:{0}]", Thread.CurrentThread.ManagedThreadId);

            ConnectedUser user = client_list[im.SenderConnection];

            if (user == null)
            {
                im.SenderConnection.Disconnect("You are not logged in.");
                return;
            }
            user.last_heartbeat_ticks = DateTime.Now.Ticks;
        }
        void c2s_stub_OnReqSendAll(NetIncomingMessage im, C2S.Message.ReqSendAll data)
        {
            Console.WriteLine("OnReqSendAll...[ThreadID:{0}]", Thread.CurrentThread.ManagedThreadId);

            ConnectedUser user = client_list[im.SenderConnection];

            if (user == null)
            {
                im.SenderConnection.Disconnect("You are not logged in.");
                return;
            }

            foreach (var client in client_list.Values)
            {
                s2c_proxy.NotifySendAll(client.connection, user.id, data.message);
            }

            s2c_proxy.ResSendAll(user.connection, (short)S2C.Message.Flag.kFlagSuccess, "Success");

            Console.WriteLine("{0} sent a message[{1}] to all from {2}.", user.id, data.message, im.SenderEndPoint.ToString());
        }
        void c2s_stub_OnReqSend(NetIncomingMessage im, C2S.Message.ReqSend data)
        {
            ConnectedUser user = client_list[im.SenderConnection];

            if (user == null)
            {
                im.SenderConnection.Disconnect("You are not logged in.");
                return;
            }

            ConnectedUser to_user = idx_id_for_client_list[data.to_id];

            if (to_user == null)
            {
                s2c_proxy.ResSend(user.connection, (short)S2C.Message.Flag.kFlagFail, "Can't find user.", data.to_id);
                return;
            }

            s2c_proxy.NotifySend(to_user.connection, user.id, data.message);
            s2c_proxy.ResSend(user.connection, (short)S2C.Message.Flag.kFlagSuccess, "Success", data.to_id);

            //Console.WriteLine("{0} sent a message[{1}] to {2} from {3}.", user.id, data.message, data.to_id, im.SenderEndPoint.ToString());
        }
        void c2s_stub_OnReqLogin(NetIncomingMessage im, C2S.Message.ReqLogin data)
        {
            if (client_list.ContainsKey(im.SenderConnection))
            {
                Console.WriteLine("{0} has already logged in.", data.id);
                return;
                //client_list[im.SenderConnection].Disconnect("Try to login from another site. You will be disconnected from server.");
            }
            if (idx_id_for_client_list.ContainsKey(data.id))
            {
                Console.WriteLine("{0} has already logged in from {1}.", data.id, idx_id_for_client_list[data.id].connection.RemoteEndPoint.ToString());
                return;
                //client_list[im.SenderConnection].Disconnect("Try to login from another site. You will be disconnected from server.");
            }
            ConnectedUser user = new ConnectedUser();

            user.connection           = im.SenderConnection;
            user.id                   = data.id;
            user.last_heartbeat_ticks = DateTime.Now.Ticks;

            client_list[im.SenderConnection] = user;
            idx_id_for_client_list[data.id]  = user;

            s2c_proxy.ResLogin(im.SenderConnection, (short)S2C.Message.Flag.kFlagSuccess);

            foreach (var client in client_list.Values)
            {
                if (client.connection == im.SenderConnection)
                {
                    continue;
                }
                s2c_proxy.NotifyLogin(client.connection, data.id);
            }

            Console.WriteLine("{0} login from {1}", data.id, im.SenderEndPoint.ToString());
        }
        void c2s_stub_OnReqLogin(NetIncomingMessage im, C2S.Message.ReqLogin data)
        {
            if (client_list.ContainsKey(im.SenderConnection))
            {
                Console.WriteLine("{0} has already logged in.", data.id);
                return;
                //client_list[im.SenderConnection].Disconnect("Try to login from another site. You will be disconnected from server.");
            }
            if (idx_id_for_client_list.ContainsKey(data.id))
            {
                Console.WriteLine("{0} has already logged in from {1}.", data.id, idx_id_for_client_list[data.id].connection.RemoteEndPoint.ToString());
                return;
                //client_list[im.SenderConnection].Disconnect("Try to login from another site. You will be disconnected from server.");
            }
            ConnectedUser user = new ConnectedUser();
            user.connection = im.SenderConnection;
            user.id = data.id;
            user.last_heartbeat_ticks = DateTime.Now.Ticks;

            client_list[im.SenderConnection] = user;
            idx_id_for_client_list[data.id] = user;

            s2c_proxy.ResLogin(im.SenderConnection, (short)S2C.Message.Flag.kFlagSuccess);

            foreach (var client in client_list.Values)
            {
                if (client.connection == im.SenderConnection) continue;
                s2c_proxy.NotifyLogin(client.connection, data.id);
            }

            Console.WriteLine("{0} login from {1}", data.id, im.SenderEndPoint.ToString());
        }