예제 #1
0
파일: Program.cs 프로젝트: hothoty/Zero
        public MasterServer()
        {
            // 생성자에 true 입력 -> 마스터 서버 Core생성
            m_Core = new ZNet.CoreServerNet(true);

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

            m_Core.Attach(proxy, stub);

            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);
            };

            // 마스터 서버에서만 발생되는 이벤트 처리 : 마스터 클라이언트 서버 입장 시점
            m_Core.master_server_join_handler = (ZNet.RemoteID remote, string description, int type, ZNet.NetAddress addr) =>
            {
                Console.WriteLine(string.Format("마스터 Client Join remoteID({0}) {1} type({2})", remote, description, type));
            };

            // 마스터 서버에서의 접속해제 이벤트 -> 마스터 클라이언트의 퇴장
            m_Core.client_disconnect_handler = (ZNet.RemoteID remote) =>
            {
                Console.WriteLine(string.Format("마스터 Client Leave remoteID({0})", remote));
            };
        }
예제 #2
0
파일: Program.cs 프로젝트: hysbest2000/Zero
        public MasterServer()
        {
            // 생성자에 true 입력 -> 마스터 서버 Core생성
            m_Core = new ZNet.CoreServerNet(true);

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

            m_Core.Attach(proxy, stub);

            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);
            };

            // 마스터 서버에서만 발생되는 이벤트 처리 : 마스터 클라이언트 서버 입장 시점
            m_Core.master_server_join_hanlder = (ZNet.RemoteID remote, string description, int type, ZNet.NetAddress addr) =>
            {
                Console.WriteLine(string.Format("마스터 Client Join remoteID({0}) {1} type({2})", remote, description, type));
            };

            // 마스터 서버에서의 접속해제 이벤트 -> 마스터 클라이언트의 퇴장
            m_Core.client_disconnect_handler = (ZNet.RemoteID remote) =>
            {
                Console.WriteLine(string.Format("마스터 Client Leave remoteID({0})", remote));
            };
        }
예제 #3
0
파일: Server.cs 프로젝트: wonderfl/Zero
        public Server(Form1 f)
        {
            form = f;

            net = new ZNet.CoreServerNet();

            proxy = new Rmi.Proxy();
            stub  = new Rmi.Stub();
            net.Attach(proxy, stub);

            InitStub();
        }
예제 #4
0
        /// <summary>
        /// 여러가지 상태를 출력합니다
        /// </summary>
        /// <param name="svr"></param>
        static public void DisplayStatus(ZNet.CoreServerNet svr)
        {
            ZNet.ServerState status;
            svr.GetCurrentState(out status);


            // 기본 정보
            Console.WriteLine(string.Format(
                                  "[NetInfo]  Connect/Join {0}/{1}  Connect(Server) {2}  Accpet/Max {3}/{4}",

                                  // 실제 연결된 client
                                  status.m_CurrentClient,

                                  // 서버에 입장완료상태의 client
                                  status.m_JoinedClient,

                                  // 서버간 direct p2p 연결된 server
                                  status.m_ServerP2PCount,

                                  // 이 서버에 추가 연결 가능한 숫자
                                  status.m_nIoAccept,

                                  // 이 서버에 최대 연결 가능한 숫자
                                  status.m_MaxAccept
                                  ));


            // 네트워크 IO 상태 정보
            Console.WriteLine(string.Format(
                                  "[IO Info]  Close {0}  Event {1}  Recv {2}  Send {3}",

                                  // current io close
                                  status.m_nIoClose,

                                  // current io event
                                  status.m_nIoEvent,

                                  // current io recv socket
                                  status.m_nIoRecv,

                                  // current io send socket
                                  status.m_nIoSend
                                  ));
        }
예제 #5
0
파일: Program.cs 프로젝트: KimKJ/Zero
        public SampleServer()
        {
            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, RemoteClass.CUserClass testClass, Dictionary<Int32, Int32> dic_test, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.reponse_message(remote, ZNet.CPackOption.Basic, testClass, dic_test, msg);
                return true;
            };

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                Console.WriteLine("Client {0} is Join {1}:{2}.\n", remote, addr.m_ip, addr.m_port);
            };

            m_Core.client_leave_handler = (ZNet.RemoteID remote) =>
            {
                Console.WriteLine("Client {0} Leave.\n", remote);
            };

            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);
            };
        }
예제 #6
0
        public SampleServer()
        {
            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, RemoteClass.CUserClass testClass, Dictionary <Int32, Int32> dic_test, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.reponse_message(remote, ZNet.CPackOption.Basic, testClass, dic_test, msg);
                return(true);
            };

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                Console.WriteLine("Client {0} is Join {1}:{2}.\n", remote, addr.m_ip, addr.m_port);
            };

            m_Core.client_leave_handler = (ZNet.RemoteID remote) =>
            {
                Console.WriteLine("Client {0} Leave.\n", remote);
            };

            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);
            };
        }
예제 #7
0
파일: Program.cs 프로젝트: hysbest2000/Zero
        public LobbyServer()
        {
            m_Core = new ZNet.CoreServerNet();

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

            m_Core.Attach(proxy, stub);



            // --- 클라에게 받는 패킷 ---

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

            // 방 만들기 : 룸 서버로 이동하기
            stub.request_make_room = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string name) =>
            {
                int server_type = (int)CasualCommon.Server.Room;

                // 아무 서버나 하나 고른다
                ZNet.MasterInfo svr;
                if (m_Core.SelectServer(server_type, out svr))
                {
                    // 이동 파라미터 구성
                    ZNet.ArrByte param_buffer;
                    CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                    param.From(CasualCommonSvr.MoveParam.ParamMove.MoveToRoom, CasualCommonSvr.MoveParam.ParamRoom.RoomMake, Guid.NewGuid(), this.svrRemoteID);
                    CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                    m_Core.ServerMoveStart(remote, svr.m_Addr, param_buffer, param.room_id);
                }
                return(true);
            };

            // 방 입장하기 : 룸서버 이동
            stub.request_join_room = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID) =>
            {
                int server_type = (int)CasualCommon.Server.Room;

                ZNet.MasterInfo[] svr_array;
                m_Core.GetServerList(server_type, out svr_array);

                ZNet.MasterInfo find_server = null;
                if (roomID == Guid.Empty)
                {
                    // 방 검색
                    foreach (var one_room in RemoteRooms)
                    {
                        // 인원숫자 검사 : 입장 가능한 방
                        if (one_room.Value.users.Count < one_room.Value.max_users)
                        {
                            // 서버 검색
                            foreach (var obj in svr_array)
                            {
                                // 해당 방이 존재하는지 확인
                                if ((ZNet.RemoteID)one_room.Value.remote_svr == obj.m_remote)
                                {
                                    roomID      = one_room.Value.roomID;
                                    find_server = obj;
                                    break;
                                }
                            }
                        }
                        if (find_server != null)
                        {
                            break;
                        }
                    }

                    if (find_server == null)
                    {
                        // 해당 서버 없음 : 이동 실패
                        return(true);
                    }


                    // 이동 파라미터 구성
                    ZNet.ArrByte param_buffer;
                    CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                    param.From(CasualCommonSvr.MoveParam.ParamMove.MoveToRoom, CasualCommonSvr.MoveParam.ParamRoom.RoomJoin, roomID, this.svrRemoteID);
                    CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                    m_Core.ServerMoveStart(remote, find_server.m_Addr, param_buffer, roomID);
                }
                else
                {
                    // 지정된 roomID가 존재하는 룸서버를 골라서 해당 방으로 입장시켜준다
                }
                return(true);
            };



            // --- 서버간 통신 패킷 ---

            // 방생성 + 입장
            stub.room_lobby_makeroom = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID, string name, int number, ZNet.RemoteID remote_svr, ZNet.RemoteID remote_lobby, Guid userID) =>
            {
                CasualCommonSvr.CRoom new_room = new CasualCommonSvr.CRoom();
                new_room.From(roomID, name, number, (int)remote_svr, (int)remote_lobby);
                new_room.users.Add(userID);
                RemoteRooms.Add(roomID, new_room);
                return(true);
            };

            // 방입장
            stub.room_lobby_joinroom = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID, Guid userID) =>
            {
                CasualCommonSvr.CRoom room_join;
                if (RemoteRooms.TryGetValue(roomID, out room_join))
                {
                    room_join.users.Add(userID);
                }
                return(true);
            };

            // 방퇴장
            stub.room_lobby_outroom = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID, Guid userID) =>
            {
                CasualCommonSvr.CRoom room_join;
                if (RemoteRooms.TryGetValue(roomID, out room_join))
                {
                    room_join.users.Remove(userID);
                }

                if (room_join.users.Count == 0)
                {
                    RemoteRooms.Remove(roomID);
                }
                return(true);
            };



            // -- Core Event --

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                // 서버이동으로 입장한 경우
                if (move_server.Count > 0)
                {
                    CasualCommonSvr.CUser rc;
                    CasualCommonSvr.Common.ServerMoveComplete(move_server, out rc);

                    CasualCommonSvr.MoveParam param;
                    CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                    Console.WriteLine("move server complete  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                    RemoteClients.Add(remote, rc);
                }
                else
                {
                    // 일반 입장은 허용하지 않음
                    m_Core.CloseRemoteClient(remote);
                }

                Console.WriteLine("Client {0} is Join {1}:{2}. Current={3}\n", remote, addr.m_ip, addr.m_port, RemoteClients.Count);
            };
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                RemoteClients.Remove(remote);
                Console.WriteLine("Client {0} Leave. MoveServer{1}  Current={2}\n", remote, bMoveServer, RemoteClients.Count);
            };

            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    buffer = null;
                    return;
                }
                rc.data.temp = "로비서버";

                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                CasualCommonSvr.Common.ServerMoveStart(rc, out buffer);

                Console.WriteLine("move server start  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
            };

            // 파라미터 검사후 서버이동 승인 여부 결정하기
            m_Core.move_server_param_handler = (ZNet.ArrByte move_param, int count_idx) =>
            {
                CasualCommonSvr.MoveParam param;
                CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                Console.WriteLine("MoveParam_2 {0} {1} {2}", param.moveTo, param.roomJoin, param.room_id);

                // 이서버가 로비서버이므로 파라미터가 로비서버일때만 승인해준다
                if (param.moveTo == CasualCommonSvr.MoveParam.ParamMove.MoveToLobby)
                {
                    return(true);
                }

                return(false);
            };

            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);
            };

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

            m_Core.server_master_join_hanlder = (ZNet.RemoteID remote, ZNet.RemoteID myRemoteID) =>
            {
                this.svrRemoteID = (int)myRemoteID;
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", myRemoteID));
            };
            m_Core.server_master_leave_hanlder = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
                run_program = false;    // 자동 종료처리를 위해
            };

            m_Core.server_refresh_hanlder = (ZNet.MasterInfo master_info) =>
            {
                //Console.WriteLine(string.Format("서버P2P remote:{0} type:{1}[{2}] current:{3} addr:{4}:{5}",
                //    master_info.m_remote,
                //    (CasualCommon.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
                //    ));
            };
        }
예제 #8
0
파일: Program.cs 프로젝트: hysbest2000/Zero
        public LoginServer()
        {
            m_Core = new ZNet.CoreServerNet();

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

            m_Core.Attach(proxy, stub);



            stub.Chat = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.Chat(remote, ZNet.CPackOption.Basic, msg);
                return(true);
            };

            stub.request_lobby_list = (ZNet.RemoteID remote, ZNet.CPackOption pkOption) =>
            {
                proxy.notify_lobby_list(remote, ZNet.CPackOption.Basic, this.lobby_list);
                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)
                {
                    CasualCommonSvr.CUser rc;
                    CasualCommonSvr.Common.ServerMoveComplete(move_server, out rc);

                    Console.WriteLine("move server complete  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                    RemoteClients.Add(remote, rc);
                }
                else
                {
                    // 일반 입장
                    CasualCommonSvr.CUser rc = new CasualCommonSvr.CUser();
                    rc.data.userID = Guid.NewGuid();
                    rc.data.info   = string.Format("유저_{0}", remote);
                    rc.data.temp   = "일반입장";
                    RemoteClients.Add(remote, rc);
                }

                proxy.notify_lobby_list(remote, ZNet.CPackOption.Basic, this.lobby_list); // 입장시 로비 리스트 보냄

                Console.WriteLine("Client {0} is Join {1}:{2}. Current={3}\n", remote, addr.m_ip, addr.m_port, RemoteClients.Count);
            };
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                RemoteClients.Remove(remote);
                Console.WriteLine("Client {0} Leave. MoveServer{1}  Current={2}\n", remote, bMoveServer, RemoteClients.Count);
            };

            // 해당 서버 타입의 조건을 검사한후 응답처리
            stub.request_go_lobby = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string lobbyname) =>
            {
                // 실제 해당 서버의 검증 작업
                ZNet.MasterInfo[] svr_array;
                m_Core.GetServerList((int)CasualCommon.Server.Lobby, out svr_array);

                foreach (var obj in svr_array)
                {
                    // 지정한 로비 서버 이름 확인
                    if (lobbyname == obj.m_Description)
                    {
                        // 이동 파라미터 구성
                        ZNet.ArrByte param_buffer;
                        CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                        param.moveTo = CasualCommonSvr.MoveParam.ParamMove.MoveToLobby;
                        CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                        // 여기서 내부패킷으로 자동적으로 서버이동이 처리 된다
                        m_Core.ServerMoveStart(remote, obj.m_Addr, param_buffer, new Guid());

                        Console.WriteLine("MoveParam_1 {0} {1} {2}", param.moveTo, param.roomJoin, param.room_id);
                        return(true);
                    }
                }
                return(true);
            };

            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    buffer = null;
                    return;
                }
                rc.data.temp = "로그인서버";

                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                CasualCommonSvr.Common.ServerMoveStart(rc, out buffer);

                Console.WriteLine("move server start  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
            };

            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);
            };

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

                // 입장한 시점 : 이 서버의 세부 정보는 이후 refresh_handler를 통해 들어오면 처리해야한다
            };
            m_Core.server_leave_hanlder = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                //Console.WriteLine(string.Format("서버P2P맴버 퇴장 remoteID {0}", remote));

                // 퇴장한 서버에 대한 처리
                lobby_list.Remove(remote);
            };

            m_Core.server_master_join_hanlder = (ZNet.RemoteID remote, ZNet.RemoteID myRemoteID) =>
            {
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", myRemoteID));
            };
            m_Core.server_master_leave_hanlder = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
                run_program = false;    // 자동 종료처리를 위해
            };

            m_Core.server_refresh_hanlder = (ZNet.MasterInfo master_info) =>
            {
                //Console.WriteLine(string.Format("서버P2P remote:{0} type:{1}[{2}] current:{3} addr:{4}:{5}",
                //    master_info.m_remote,
                //    (CasualCommon.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
                //    ));

                // 로비 리스트 정보 갱신
                lobby_list.Remove(master_info.m_remote);
                if ((CasualCommon.Server)master_info.m_ServerType == CasualCommon.Server.Lobby)
                {
                    lobby_list.Add(master_info.m_remote, master_info);
                }
            };
        }
예제 #9
0
파일: Program.cs 프로젝트: ypdevman/Zero
        public RoomServer()
        {
            m_Core = new ZNet.CoreServerNet();

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

            m_Core.Attach(proxy, stub);



            // --- 클라에게 받는 패킷 ---

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

            // 방 나가기
            stub.request_out_room = (ZNet.RemoteID remote, ZNet.CPackOption pkOption) =>
            {
                int server_type = (int)CasualCommon.Server.Lobby;

                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    return(true);
                }

                CasualCommonSvr.CRoom room_join;
                if (RemoteRooms.TryGetValue(rc.roomID, out room_join))
                {
                    ZNet.MasterInfo[] svr_array;
                    m_Core.GetServerList(server_type, out svr_array);

                    // 서버 검색
                    foreach (var obj in svr_array)
                    {
                        // 원래 방입장하기 전에 있었던 로비서버로 돌아가기 위해
                        if (obj.m_remote == (ZNet.RemoteID)room_join.remote_lobby)
                        {
                            // 이동 파라미터 구성 : 타겟을 로비서버로 (나머지 파라미터는 룸->로비 이동시에는 별 의미없음)
                            ZNet.ArrByte param_buffer;
                            CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                            param.From(CasualCommonSvr.MoveParam.ParamMove.MoveToLobby, CasualCommonSvr.MoveParam.ParamRoom.RoomNull, Guid.NewGuid(), this.svrRemoteID);
                            CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                            m_Core.ServerMoveStart(remote, obj.m_Addr, param_buffer, param.room_id);
                            return(true);
                        }
                    }
                }
                return(true);
            };



            // 파라미터 검사후 서버이동 승인 여부 결정하기
            m_Core.move_server_param_handler = (ZNet.ArrByte move_param, int count_idx) =>
            {
                CasualCommonSvr.MoveParam param;
                CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                Console.WriteLine("MoveParam_2 {0} {1} {2}", param.moveTo, param.roomJoin, param.room_id);

                if (param.moveTo == CasualCommonSvr.MoveParam.ParamMove.MoveToRoom)
                {
                    if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomMake)
                    {
                        return(true);
                    }
                    else if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomJoin)
                    {
                        // 현재 이 방의 인원숫자 + allow숫자(count_idx)를 비교하여 입장 허용 여부를 결정한다
                        CasualCommonSvr.CRoom room_join;
                        if (RemoteRooms.TryGetValue(param.room_id, out room_join))
                        {
                            //if (room_join.users.Count + count_idx < 1)
                            if (room_join.users.Count + count_idx < room_join.max_users)
                            {
                                return(true);
                            }
                        }
                    }
                }
                return(false);
            };

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                // 서버이동으로 입장한 경우
                if (move_server.Count > 0)
                {
                    CasualCommonSvr.CUser rc;
                    CasualCommonSvr.Common.ServerMoveComplete(move_server, out rc);

                    CasualCommonSvr.MoveParam param;
                    CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                    if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomMake)
                    {
                        // 방생성
                        CasualCommonSvr.CRoom new_room = new CasualCommonSvr.CRoom();
                        new_room.From(param.room_id, "방이름", 123, this.svrRemoteID, param.lobby_remote);

                        if (RemoteRooms.ContainsKey(param.room_id))
                        {
                            // 동일한 guid생성을 허용금지 : 예외처리필요
                        }

                        RemoteRooms.Add(param.room_id, new_room);

                        new_room.users.Add(rc.data.userID);

                        // 로비서버에게 방생성을 알린다
                        proxy.room_lobby_makeroom((ZNet.RemoteID)new_room.remote_lobby, ZNet.CPackOption.Basic,
                                                  new_room.roomID, new_room.name, new_room.number, (ZNet.RemoteID)new_room.remote_svr, (ZNet.RemoteID)new_room.remote_lobby, rc.data.userID);
                    }
                    else if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomJoin)
                    {
                        // 방입장
                        CasualCommonSvr.CRoom room_join;
                        if (RemoteRooms.TryGetValue(param.room_id, out room_join))
                        {
                            room_join.users.Add(rc.data.userID);
                        }
                        else
                        {
                            Console.WriteLine("move server join error!!! {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                            m_Core.CloseRemoteClient(remote);
                            return;
                        }

                        // 로비서버에게 방입장을 알린다
                        proxy.room_lobby_joinroom((ZNet.RemoteID)room_join.remote_lobby, ZNet.CPackOption.Basic, room_join.roomID, rc.data.userID);
                    }

                    rc.roomID = param.room_id;

                    Console.WriteLine("move server complete  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                    RemoteClients.Add(remote, rc);
                }
                else
                {
                    // 일반 입장은 허용하지 않음
                    m_Core.CloseRemoteClient(remote);
                }

                Console.WriteLine("Client {0} is Join {1}:{2}. Current={3}\n", remote, addr.m_ip, addr.m_port, RemoteClients.Count);
            };
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc))
                {
                    CasualCommonSvr.CRoom room_join;
                    if (RemoteRooms.TryGetValue(rc.roomID, out room_join))
                    {
                        room_join.users.Remove(rc.data.userID);
                    }

                    if (room_join.users.Count == 0)
                    {
                        RemoteRooms.Remove(rc.roomID);
                    }

                    // 로비서버에게 방퇴장을 알린다
                    proxy.room_lobby_outroom((ZNet.RemoteID)room_join.remote_lobby, ZNet.CPackOption.Basic, room_join.roomID, rc.data.userID);

                    Console.WriteLine("Client {0} Leave.\n", remote);
                }
            };

            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    buffer = null;
                    return;
                }
                rc.data.temp = "룸서버";

                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                CasualCommonSvr.Common.ServerMoveStart(rc, out buffer);

                Console.WriteLine("move server start  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
            };

            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);
            };

            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) =>
            {
                this.svrRemoteID = (int)myRemoteID;
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", myRemoteID));
            };
            m_Core.server_master_leave_handler = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
                run_program = false;    // 자동 종료처리를 위해
            };

            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,
                //    (CasualCommon.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
                //    ));
            };
        }
예제 #10
0
파일: Program.cs 프로젝트: hothoty/Zero
        public LoginServer()
        {
            m_Core = new ZNet.CoreServerNet();

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

            m_Core.Attach(proxy, stub);



            stub.Chat = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.Chat(remote, ZNet.CPackOption.Basic, msg);
                return true;
            };

            stub.request_lobby_list = (ZNet.RemoteID remote, ZNet.CPackOption pkOption) =>
            {
                proxy.notify_lobby_list(remote, ZNet.CPackOption.Basic, this.lobby_list);
                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)
                {
                    CasualCommonSvr.CUser rc;
                    CasualCommonSvr.Common.ServerMoveComplete(move_server, out rc);

                    Console.WriteLine("move server complete  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                    RemoteClients.Add(remote, rc);
                }
                else
                {
                    // 일반 입장
                    CasualCommonSvr.CUser rc = new CasualCommonSvr.CUser();
                    rc.data.userID = Guid.NewGuid();
                    rc.data.info = string.Format("유저_{0}", remote);
                    rc.data.temp = "일반입장";
                    RemoteClients.Add(remote, rc);
                }

                proxy.notify_lobby_list(remote, ZNet.CPackOption.Basic, this.lobby_list); // 입장시 로비 리스트 보냄

                Console.WriteLine("Client {0} is Join {1}:{2}. Current={3}\n", remote, addr.m_ip, addr.m_port, RemoteClients.Count);
            };
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                RemoteClients.Remove(remote);
                Console.WriteLine("Client {0} Leave. MoveServer{1}  Current={2}\n", remote, bMoveServer, RemoteClients.Count);
            };

            // 해당 서버 타입의 조건을 검사한후 응답처리
            stub.request_go_lobby = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string lobbyname) =>
            {
                // 실제 해당 서버의 검증 작업
                ZNet.MasterInfo[] svr_array;
                m_Core.GetServerList((int)CasualCommon.Server.Lobby, out svr_array);

                foreach (var obj in svr_array)
                {
                    // 지정한 로비 서버 이름 확인
                    if(lobbyname == obj.m_Description)
                    {
                        // 이동 파라미터 구성
                        ZNet.ArrByte param_buffer;
                        CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                        param.moveTo = CasualCommonSvr.MoveParam.ParamMove.MoveToLobby;
                        CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                        // 여기서 내부패킷으로 자동적으로 서버이동이 처리 된다
                        m_Core.ServerMoveStart(remote, obj.m_Addr, param_buffer, new Guid());

                        Console.WriteLine("MoveParam_1 {0} {1} {2}", param.moveTo, param.roomJoin, param.room_id);
                        return true;
                    }
                }
                return true;
            };

            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    buffer = null;
                    return;
                }
                rc.data.temp = "로그인서버";

                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                CasualCommonSvr.Common.ServerMoveStart(rc, out buffer);

                Console.WriteLine("move server start  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
            };

            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);
            };

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

                // 입장한 시점 : 이 서버의 세부 정보는 이후 refresh_handler를 통해 들어오면 처리해야한다
            };
            m_Core.server_leave_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                //Console.WriteLine(string.Format("서버P2P맴버 퇴장 remoteID {0}", remote));

                // 퇴장한 서버에 대한 처리
                lobby_list.Remove(remote);
            };

            m_Core.server_master_join_handler = (ZNet.RemoteID remote, ZNet.RemoteID myRemoteID) =>
            {
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", myRemoteID));
            };
            m_Core.server_master_leave_handler = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
                run_program = false;    // 자동 종료처리를 위해
            };

            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,
                //    (CasualCommon.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
                //    ));

                // 로비 리스트 정보 갱신
                lobby_list.Remove(master_info.m_remote);
                if ((CasualCommon.Server)master_info.m_ServerType == CasualCommon.Server.Lobby)
                {
                    lobby_list.Add(master_info.m_remote, master_info);
                }
            };
        }
예제 #11
0
파일: Program.cs 프로젝트: hothoty/Zero
        public LobbyServer()
        {
            m_Core = new ZNet.CoreServerNet();

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

            m_Core.Attach(proxy, stub);



            // --- 클라에게 받는 패킷 ---

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

            // 방 만들기 : 룸 서버로 이동하기
            stub.request_make_room = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string name) =>
            {
                int server_type = (int)CasualCommon.Server.Room;

                // 아무 서버나 하나 고른다
                ZNet.MasterInfo svr;
                if (m_Core.SelectServer(server_type, out svr))
                {
                    // 이동 파라미터 구성
                    ZNet.ArrByte param_buffer;
                    CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                    param.From(CasualCommonSvr.MoveParam.ParamMove.MoveToRoom, CasualCommonSvr.MoveParam.ParamRoom.RoomMake, Guid.NewGuid(), this.svrRemoteID);
                    CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                    m_Core.ServerMoveStart(remote, svr.m_Addr, param_buffer, param.room_id);
                }
                return true;
            };

            // 방 입장하기 : 룸서버 이동
            stub.request_join_room = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID) =>
            {
                int server_type = (int)CasualCommon.Server.Room;

                ZNet.MasterInfo[] svr_array;
                m_Core.GetServerList(server_type, out svr_array);

                ZNet.MasterInfo find_server = null;
                if (roomID == Guid.Empty)
                {
                    // 방 검색
                    foreach (var one_room in RemoteRooms)
                    {
                        // 인원숫자 검사 : 입장 가능한 방
                        if (one_room.Value.users.Count < one_room.Value.max_users)
                        {
                            // 서버 검색
                            foreach (var obj in svr_array)
                            {
                                // 해당 방이 존재하는지 확인
                                if ((ZNet.RemoteID)one_room.Value.remote_svr == obj.m_remote)
                                {
                                    roomID = one_room.Value.roomID;
                                    find_server = obj;
                                    break;
                                }
                            }
                        }
                        if (find_server != null)
                            break;
                    }

                    if (find_server == null)
                    {
                        // 해당 서버 없음 : 이동 실패
                        return true;
                    }


                    // 이동 파라미터 구성
                    ZNet.ArrByte param_buffer;
                    CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                    param.From(CasualCommonSvr.MoveParam.ParamMove.MoveToRoom, CasualCommonSvr.MoveParam.ParamRoom.RoomJoin, roomID, this.svrRemoteID);
                    CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                    m_Core.ServerMoveStart(remote, find_server.m_Addr, param_buffer, roomID);
                }
                else
                {
                    // 지정된 roomID가 존재하는 룸서버를 골라서 해당 방으로 입장시켜준다
                }
                return true;
            };




            // --- 서버간 통신 패킷 ---

            // 방생성 + 입장
            stub.room_lobby_makeroom = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID, string name, int number, ZNet.RemoteID remote_svr, ZNet.RemoteID remote_lobby, Guid userID) =>
            {
                CasualCommonSvr.CRoom new_room = new CasualCommonSvr.CRoom();
                new_room.From(roomID, name, number, (int)remote_svr, (int)remote_lobby);
                new_room.users.Add(userID);
                RemoteRooms.Add(roomID, new_room);
                return true;
            };

            // 방입장
            stub.room_lobby_joinroom = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID, Guid userID) =>
            {
                CasualCommonSvr.CRoom room_join;
                if (RemoteRooms.TryGetValue(roomID, out room_join))
                {
                    room_join.users.Add(userID);
                }
                return true;
            };

            // 방퇴장
            stub.room_lobby_outroom = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, Guid roomID, Guid userID) =>
            {
                CasualCommonSvr.CRoom room_join;
                if (RemoteRooms.TryGetValue(roomID, out room_join))
                {
                    room_join.users.Remove(userID);
                }

                if (room_join.users.Count == 0)
                {
                    RemoteRooms.Remove(roomID);
                }
                return true;
            };




            // -- Core Event --

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                // 서버이동으로 입장한 경우
                if (move_server.Count > 0)
                {
                    CasualCommonSvr.CUser rc;
                    CasualCommonSvr.Common.ServerMoveComplete(move_server, out rc);

                    CasualCommonSvr.MoveParam param;
                    CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                    Console.WriteLine("move server complete  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                    RemoteClients.Add(remote, rc);
                }
                else
                {
                    // 일반 입장은 허용하지 않음
                    m_Core.CloseRemoteClient(remote);
                }

                Console.WriteLine("Client {0} is Join {1}:{2}. Current={3}\n", remote, addr.m_ip, addr.m_port, RemoteClients.Count);
            };
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                RemoteClients.Remove(remote);
                Console.WriteLine("Client {0} Leave. MoveServer{1}  Current={2}\n", remote, bMoveServer, RemoteClients.Count);
            };

            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    buffer = null;
                    return;
                }
                rc.data.temp = "로비서버";

                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                CasualCommonSvr.Common.ServerMoveStart(rc, out buffer);

                Console.WriteLine("move server start  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
            };

            // 파라미터 검사후 서버이동 승인 여부 결정하기
            m_Core.move_server_param_handler = (ZNet.ArrByte move_param, int count_idx) =>
            {
                CasualCommonSvr.MoveParam param;
                CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                Console.WriteLine("MoveParam_2 {0} {1} {2}", param.moveTo, param.roomJoin, param.room_id);

                // 이서버가 로비서버이므로 파라미터가 로비서버일때만 승인해준다
                if (param.moveTo == CasualCommonSvr.MoveParam.ParamMove.MoveToLobby)
                    return true;

                return false;
            };

            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);
            };

            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) =>
            {
                this.svrRemoteID = (int)myRemoteID;
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", myRemoteID));
            };
            m_Core.server_master_leave_handler = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
                run_program = false;    // 자동 종료처리를 위해
            };

            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,
                //    (CasualCommon.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
                //    ));
            };
        }
예제 #12
0
 protected virtual void NewCore()
 {
     m_Core = new ZNet.CoreServerNet();
 }
예제 #13
0
파일: Program.cs 프로젝트: hothoty/Zero
        public SampleServer()
        {
            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, RemoteClass.CUserClass testClass, Dictionary<Int32, Int32> dic_test, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.reponse_message(remote, ZNet.CPackOption.Basic, testClass, dic_test, msg);
                return true;
            };

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                Console.WriteLine("Client {0} is Join {1}:{2}.\n", remote, addr.m_ip, addr.m_port);
            };

            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                Console.WriteLine("Client {0} Leave.\n", remote);
            };


            // 주기적으로 처리할 내용 : m_UpdateTimeMs 에서 설정한 시간마다 콜백됩니다
            m_Core.update_event_handler = () =>
            {
                Console.WriteLine("Server Update Event\n");
            };


            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);
            };


            // 연결복구 관련 이벤트
            m_Core.recovery_info_handler = (ZNet.RemoteID remoteNew, ZNet.RemoteID remoteTo) =>
            {
                Console.WriteLine("Recovery try... new connection Client[{0}] to Client[{1}].\n", remoteNew, remoteTo);
            };
            m_Core.recovery_start_handler = (ZNet.RemoteID remote) =>
            {
                Console.WriteLine("Recovery Start Client {0}.\n", remote);
            };
            m_Core.recovery_end_handler = (ZNet.RemoteID remote, ZNet.NetAddress addrNew, bool bTimeOut) =>
            {
                if (bTimeOut)
                    Console.WriteLine("Recovery TimeOUT Client {0}.\n", remote);
                else
                    Console.WriteLine("Recovery Complete Client {0}.  NewAddr[{1}:{2}]\n", remote, addrNew.m_ip, addrNew.m_port);
            };

            // 서버 접속제한시점의 이벤트
            m_Core.limit_connection_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                Console.WriteLine("Client {0}, {1} is Leave.\n", remote, addr.m_ip, addr.m_port);
            };
        }
예제 #14
0
파일: Program.cs 프로젝트: wonderfl/Zero
        public SampleServer()
        {
            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, RemoteClass.CUserClass testClass, Dictionary <Int32, Int32> dic_test, string msg) =>
            {
                Console.WriteLine("Remote[{0}] msg : {1}", remote, msg);
                proxy.reponse_message(remote, ZNet.CPackOption.Basic, testClass, dic_test, msg);
                return(true);
            };

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                Console.WriteLine("Client {0} is Join {1}:{2}.\n", remote, addr.m_ip, addr.m_port);
            };

            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                Console.WriteLine("Client {0} Leave.\n", remote);
            };


            // 주기적으로 처리할 내용 : m_UpdateTimeMs 에서 설정한 시간마다 콜백됩니다
            m_Core.update_event_handler = () =>
            {
                Console.WriteLine("Server Update Event\n");
            };


            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);
            };


            // 연결복구 관련 이벤트
            m_Core.recovery_info_handler = (ZNet.RemoteID remoteNew, ZNet.RemoteID remoteTo) =>
            {
                Console.WriteLine("Recovery try... new connection Client[{0}] to Client[{1}].\n", remoteNew, remoteTo);
            };
            m_Core.recovery_start_handler = (ZNet.RemoteID remote) =>
            {
                Console.WriteLine("Recovery Start Client {0}.\n", remote);
            };
            m_Core.recovery_end_handler = (ZNet.RemoteID remote, ZNet.NetAddress addrNew, bool bTimeOut) =>
            {
                if (bTimeOut)
                {
                    Console.WriteLine("Recovery TimeOUT Client {0}.\n", remote);
                }
                else
                {
                    Console.WriteLine("Recovery Complete Client {0}.  NewAddr[{1}:{2}]\n", remote, addrNew.m_ip, addrNew.m_port);
                }
            };

            // 서버 접속제한시점의 이벤트
            m_Core.limit_connection_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr) =>
            {
                Console.WriteLine("Client {0}, {1} is Leave.\n", remote, addr.m_ip, addr.m_port);
            };
        }
예제 #15
0
파일: Program.cs 프로젝트: wonderfl/Zero
        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
                    ));
            };
        }
예제 #16
0
파일: Program.cs 프로젝트: wonderfl/Zero
        static void DisplayStatus(ZNet.CoreServerNet svr)
        {
            ZNet.ServerState status;
            svr.GetCurrentState(out status);


            // 기본 정보
            Console.WriteLine(string.Format(
                "[NetInfo]  Connect/Join {0}({1})/{2}  Connect(Server) {3}/{4}  Accpet/Max {5}/{6}",

                // 실제 연결된 client
                status.m_CurrentClient,

                // 연결복구 처리과정인 client
                status.m_RecoveryCount,

                // 서버에 입장완료상태의 client
                status.m_JoinedClient,

                // 서버간 direct p2p 연결된 server
                status.m_ServerP2PCount,

                // 서버간 direct p2p 연결 모니터링중인 server(서버간 연결 자동복구를 위한 모니터링)
                status.m_ServerP2PConCount,

                // 이 서버에 추가 연결 가능한 숫자
                status.m_nIoAccept,

                // 이 서버에 최대 연결 가능한 숫자
                status.m_MaxAccept
                ));


            // 엔진 내부에서 작업중인 IO 관련 상태 정보
            Console.WriteLine(string.Format(
                "[IO Info]  Close {0}  Event {1}  Recv {2}  Send {3}",

                // current io close
                status.m_nIoClose,

                // current io event
                status.m_nIoEvent,

                // current io recv socket
                status.m_nIoRecv,

                // current io send socket
                status.m_nIoSend
            ));


            // 엔진 메모리 관련 사용 정보
            Console.WriteLine(string.Format(
                "[MemInfo]  Alloc/Instant[{0}/{1}], test[{2}], EngineVersion[{3}.{4:0000}] ",

                // 미리 할당된 IO 메모리
                status.m_nAlloc,

                // 즉석 할당된 IO 메모리
                status.m_nAllocInstant,

                // test data
                status.m_test_data,

                // Core버전
                svr.GetCoreVersion() / 10000,
                svr.GetCoreVersion() % 10000
            ));


            // 스레드 정보
            string strThr = "[ThreadInfo] (";
            int MaxDisplayThreadCount = status.m_arrThread.Count();
            if (MaxDisplayThreadCount > 8)   // 화면이 복잡하니까 그냥 최대 8개까지만 표시
            {
                strThr += MaxDisplayThreadCount;
                strThr += ") : ";
                MaxDisplayThreadCount = 8;
            }
            else
            {
                strThr += MaxDisplayThreadCount;
                strThr += ") : ";
            }

            for (int i = 0; i < MaxDisplayThreadCount; i++)
            {
                strThr += "[";
                strThr += status.m_arrThread[i].m_ThreadID;     // 스레드ID
                strThr += "/";
                strThr += status.m_arrThread[i].m_CountQueue;   // 처리 대기중인 작업
                strThr += "/";
                strThr += status.m_arrThread[i].m_CountWorked;  // 처리된 작업(누적)
                strThr += "] ";
            }
            Console.WriteLine(strThr);
        }
예제 #17
0
파일: Program.cs 프로젝트: hothoty/Zero
        public RoomServer()
        {
            m_Core = new ZNet.CoreServerNet();

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

            m_Core.Attach(proxy, stub);



            // --- 클라에게 받는 패킷 ---

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

            // 방 나가기
            stub.request_out_room = (ZNet.RemoteID remote, ZNet.CPackOption pkOption) =>
            {
                int server_type = (int)CasualCommon.Server.Lobby;

                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                    return true;

                CasualCommonSvr.CRoom room_join;
                if (RemoteRooms.TryGetValue(rc.roomID, out room_join))
                {
                    ZNet.MasterInfo[] svr_array;
                    m_Core.GetServerList(server_type, out svr_array);

                    // 서버 검색
                    foreach (var obj in svr_array)
                    {
                        // 원래 방입장하기 전에 있었던 로비서버로 돌아가기 위해
                        if (obj.m_remote == (ZNet.RemoteID)room_join.remote_lobby)
                        {
                            // 이동 파라미터 구성 : 타겟을 로비서버로 (나머지 파라미터는 룸->로비 이동시에는 별 의미없음)
                            ZNet.ArrByte param_buffer;
                            CasualCommonSvr.MoveParam param = new CasualCommonSvr.MoveParam();
                            param.From(CasualCommonSvr.MoveParam.ParamMove.MoveToLobby, CasualCommonSvr.MoveParam.ParamRoom.RoomNull, Guid.NewGuid(), this.svrRemoteID);
                            CasualCommonSvr.Common.ServerMoveParam1(param, out param_buffer);

                            m_Core.ServerMoveStart(remote, obj.m_Addr, param_buffer, param.room_id);
                            return true;
                        }
                    }
                }
                return true;
            };




            // 파라미터 검사후 서버이동 승인 여부 결정하기
            m_Core.move_server_param_handler = (ZNet.ArrByte move_param, int count_idx) =>
            {
                CasualCommonSvr.MoveParam param;
                CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                Console.WriteLine("MoveParam_2 {0} {1} {2}", param.moveTo, param.roomJoin, param.room_id);

                if (param.moveTo == CasualCommonSvr.MoveParam.ParamMove.MoveToRoom)
                {
                    if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomMake)
                    {
                        return true;
                    }
                    else if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomJoin)
                    {
                        // 현재 이 방의 인원숫자 + allow숫자(count_idx)를 비교하여 입장 허용 여부를 결정한다
                        CasualCommonSvr.CRoom room_join;
                        if (RemoteRooms.TryGetValue(param.room_id, out room_join))
                        {
                            //if (room_join.users.Count + count_idx < 1)
                            if (room_join.users.Count + count_idx < room_join.max_users)
                                return true;
                        }
                    }
                }
                return false;
            };

            m_Core.client_join_handler = (ZNet.RemoteID remote, ZNet.NetAddress addr, ZNet.ArrByte move_server, ZNet.ArrByte move_param) =>
            {
                // 서버이동으로 입장한 경우
                if (move_server.Count > 0)
                {
                    CasualCommonSvr.CUser rc;
                    CasualCommonSvr.Common.ServerMoveComplete(move_server, out rc);

                    CasualCommonSvr.MoveParam param;
                    CasualCommonSvr.Common.ServerMoveParam2(move_param, out param);

                    if (param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomMake)
                    {
                        // 방생성
                        CasualCommonSvr.CRoom new_room = new CasualCommonSvr.CRoom();
                        new_room.From(param.room_id, "방이름", 123, this.svrRemoteID, param.lobby_remote);

                        if (RemoteRooms.ContainsKey(param.room_id))
                        {
                            // 동일한 guid생성을 허용금지 : 예외처리필요
                        }

                        RemoteRooms.Add(param.room_id, new_room);

                        new_room.users.Add(rc.data.userID);

                        // 로비서버에게 방생성을 알린다
                        proxy.room_lobby_makeroom((ZNet.RemoteID)new_room.remote_lobby, ZNet.CPackOption.Basic,
                            new_room.roomID, new_room.name, new_room.number, (ZNet.RemoteID)new_room.remote_svr, (ZNet.RemoteID)new_room.remote_lobby, rc.data.userID);
                    }
                    else if(param.roomJoin == CasualCommonSvr.MoveParam.ParamRoom.RoomJoin)
                    {
                        // 방입장
                        CasualCommonSvr.CRoom room_join;
                        if (RemoteRooms.TryGetValue(param.room_id, out room_join))
                        {
                            room_join.users.Add(rc.data.userID);
                        }
                        else
                        {
                            Console.WriteLine("move server join error!!! {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                            m_Core.CloseRemoteClient(remote);
                            return;
                        }

                        // 로비서버에게 방입장을 알린다
                        proxy.room_lobby_joinroom((ZNet.RemoteID)room_join.remote_lobby, ZNet.CPackOption.Basic, room_join.roomID, rc.data.userID);
                    }

                    rc.roomID = param.room_id;

                    Console.WriteLine("move server complete  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
                    RemoteClients.Add(remote, rc);
                }
                else
                {
                    // 일반 입장은 허용하지 않음
                    m_Core.CloseRemoteClient(remote);
                }

                Console.WriteLine("Client {0} is Join {1}:{2}. Current={3}\n", remote, addr.m_ip, addr.m_port, RemoteClients.Count);
            };
            m_Core.client_leave_handler = (ZNet.RemoteID remote, bool bMoveServer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc))
                {
                    CasualCommonSvr.CRoom room_join;
                    if (RemoteRooms.TryGetValue(rc.roomID, out room_join))
                    {
                        room_join.users.Remove(rc.data.userID);
                    }

                    if (room_join.users.Count == 0)
                    {
                        RemoteRooms.Remove(rc.roomID);
                    }

                    // 로비서버에게 방퇴장을 알린다
                    proxy.room_lobby_outroom((ZNet.RemoteID)room_join.remote_lobby, ZNet.CPackOption.Basic, room_join.roomID, rc.data.userID);

                    Console.WriteLine("Client {0} Leave.\n", remote);
                }
            };

            m_Core.move_server_start_handler = (ZNet.RemoteID remote, out ZNet.ArrByte buffer) =>
            {
                CasualCommonSvr.CUser rc;
                if (RemoteClients.TryGetValue(remote, out rc) == false)
                {
                    buffer = null;
                    return;
                }
                rc.data.temp = "룸서버";

                // 여기서는 이동할 서버로 동기화 시킬 유저 데이터를 구성하여 buffer에 넣어둔다 -> 완료서버에서 해당 데이터를 그대로 받게된다
                CasualCommonSvr.Common.ServerMoveStart(rc, out buffer);

                Console.WriteLine("move server start  {0} {1} {2}", rc.data.userID, rc.data.info, rc.data.temp);
            };

            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);
            };

            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) =>
            {
                this.svrRemoteID = (int)myRemoteID;
                Console.WriteLine(string.Format("마스터서버에 입장성공 remoteID {0}", myRemoteID));
            };
            m_Core.server_master_leave_handler = () =>
            {
                Console.WriteLine(string.Format("마스터서버와 연결종료!!!"));
                run_program = false;    // 자동 종료처리를 위해
            };

            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,
                //    (CasualCommon.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
                //    ));
            };
        }