Beispiel #1
0
        public LoginServer()
        {
            m_Core = new ZNet.CoreServerNet();

            proxy = new Rmi.Proxy();
            stub = new Rmi.Stub();

            m_Core.Attach(proxy, stub);

            // 메세지 패킷 처리 샘플
            stub.request_message = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.reponse_message(remote, ZNet.CPackOption.Basic, msg);
                return true;
            };

            // 서버이동 요청 패킷 처리 : 요청 받은 서버타입중 원활한 서버를 찾아서 수동으로 접속할 수 있게 주소를 보내준다
            stub.request_move_to_server = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, int server_type) =>
            {
                ZNet.MasterInfo selectSvr;
                if (m_Core.SelectServer(server_type, out selectSvr))
                {
                    proxy.reponse_move_to_server(remote, ZNet.CPackOption.Basic, true, selectSvr.m_Addr);
                }
                else
                {
                    proxy.reponse_move_to_server(remote, ZNet.CPackOption.Basic, false, new ZNet.NetAddress());
                }
                return true;
            };

            // 클라이언트가 이 서버에 입장된 시점
            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                if (move_server.Count == 0)
                {
                    // 일반 입장
                    Console.WriteLine("Client {0} is Join {1}:{2}.\n", remote, addr.m_ip, addr.m_port);
                }
                else // 서버 이동으로 입장한 경우
                {
                    // 이동 시작한 서버에서 구성해둔 유저 데이터 버퍼를 이용해 동기화 처리한다
                    ZNet.CMessage msg = new ZNet.CMessage();
                    msg.m_array = move_server;

                    ServerP2P_Common.UserDataSync user_data;
                    msg.Read(out user_data.info);
                    msg.Read(out user_data.item_id);
                    Console.WriteLine("Client Join (move server) {0}  {1}", user_data.info, user_data.item_id);
                }
            };

            // 클라이언트가 이 서버에 퇴장하는 시점
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                Console.WriteLine("Client {0} Leave.\n", remote);
            };


            // 서버 이동 시작 시점 : 완료 이벤트는 이동 성공한 서버에서 발생
            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                ZNet.CMessage msg = new ZNet.CMessage();
                ServerP2P_Common.UserDataSync user_data;

                user_data.info = "유저 데이터 정보, DBID=1234, 로그인서버입니다";
                user_data.item_id = 12312309871234;

                msg.Write(user_data.info);
                msg.Write(user_data.item_id);

                buffer = msg.m_array;

                Console.WriteLine("move server start  {0}  {1}", user_data.info, user_data.item_id);
            };

            m_Core.message_handler = (ZNet.ResultInfo result) =>
            {
                string str_msg = "Msg : ";
                str_msg += result.msg;
                Console.WriteLine(str_msg);
            };
            m_Core.exception_handler = (Exception e) =>
            {
                string str_msg = "Exception : ";
                str_msg += e.ToString();
                Console.WriteLine(str_msg);
            };


            // server p2p관련 이벤트
            m_Core.server_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                Console.WriteLine(string.Format("서버P2P맴버 입장 remoteID {0}", remote));
            };

            m_Core.server_leave_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                Console.WriteLine(string.Format("서버P2P맴버 퇴장 remoteID {0}", remote));
            };

            m_Core.server_master_join_handler = (ZNet.RemoteID remote, ZNet.RemoteID myRemoteID) =>
            {
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", remote));
            };

            m_Core.server_master_leave_handler = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
            };

            m_Core.server_refresh_handler = (ZNet.MasterInfo master_info) =>
            {
                Console.WriteLine(string.Format("서버P2P remote:{0} type:{1}[{2}] current:{3} addr:{4}:{5}",
                    master_info.m_remote,
                    (ServerP2P_Common.Server)master_info.m_ServerType,
                    master_info.m_Description,
                    master_info.m_Clients,
                    master_info.m_Addr.m_ip,
                    master_info.m_Addr.m_port
                    ));
            };
        }