Exemple #1
0
        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
                //    ));
            };
        }
Exemple #2
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
                    ));
            };
        }
Exemple #3
0
        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
                //    ));
            };
        }