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)); }; }
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)); }; }
public UdoServer() { proxy = new Rmi.Proxy(); stub = new Rmi.Stub(); m_Core.Attach(proxy, stub); // 받은 프로토콜 옵션 그대로 돌려준다 : pkOption을 그대로 사용함 stub.request_Udp = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string msg) => { if (pkOption.m_protocol == ZNet.Protocol8.Protocol_Udp) { Console.WriteLine("Remote[{0}] msg(udp) : {1}", remote, msg); } else { Console.WriteLine("Remote[{0}] msg(tcp) : {1}", remote, msg); } proxy.reponse_Udp(remote, pkOption, msg); return(true); }; // udp ready 이벤트 m_Core.ready_udp_handler = (ZNet.RemoteID remote, bool bTrust) => { Console.WriteLine("ready udp remote {0} trust {1}", remote, bTrust); }; 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); }; }
public Server(Form1 f) { form = f; net = new ZNet.CoreServerNet(); proxy = new Rmi.Proxy(); stub = new Rmi.Stub(); net.Attach(proxy, stub); InitStub(); }
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); }; }
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); }; }
public void OnStart() { NewCore(); 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; Log.logger.Info(str_msg); }; m_Core.exception_handler = (Exception e) => { string str_msg = "Exception : "; str_msg += e.ToString(); Log.logger.Error(str_msg); }; ZNet.StartOption param; BeforeStart(out param); ZNet.ResultInfo outResult = new ZNet.ResultInfo(); if (m_Core.Start(param, outResult)) { Log.logger.InfoFormat("{0} start ok.", this.name); } else { Log.logger.ErrorFormat("{0} Start error : {1}", this.name, outResult.msg); } AfterStart(); }
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); } }; }
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 // )); }; }
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); } }; }
public GrpServer() { this.GroupID = ZNet.RemoteID.Remote_None; 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.GroupTestCommand = (ZNet.RemoteID remote, ZNet.CPackOption pkOption, string cmd) => { switch (cmd) { case "/make": // 그룹 생성 또는 합류처리 if (this.GroupID == ZNet.RemoteID.Remote_None) { if (this.m_Core.CreateGroup(out this.GroupID, remote)) { Console.WriteLine("그룹생성완료 groupID[{0}] remote[{1}] members[1]", this.GroupID, remote); } else { Console.WriteLine("그룹생성오류"); } } else { int Members; if (this.m_Core.JoinGroup(this.GroupID, remote, out Members)) { Console.WriteLine("그룹합류완료 groupID[{0}] remote[{1}] members[{2}]", this.GroupID, remote, Members); } } break; case "/destroy": // 그룹파괴 시도하기 : group_destroy_handler를 통해 결과 통보 this.m_Core.DestroyGroup(this.GroupID); break; case "/leave": // 그룹탈퇴 시도하기 : group_memberout_handler를 통해 결과 통보 this.m_Core.OutGroup(this.GroupID, remote); break; case "/msg": // 그룹 전체 메세지 보내기 : remoteID에 그룹아이디(this.GroupID)를 넣는것으로 ok proxy.Chat(this.GroupID, ZNet.CPackOption.Basic, "Group test message."); break; } return(true); }; // 그룹 관련 이벤트 처리 m_Core.group_memberout_handler = (ZNet.RemoteID groupID, ZNet.RemoteID memberID, int Members) => { Console.WriteLine("GroupOut, groupID {0} remote {1} members {2}\n", groupID, memberID, Members); }; m_Core.group_destroy_handler = (ZNet.RemoteID groupID) => { Console.WriteLine("GroupDestroy, groupID {0}\n", groupID); this.GroupID = ZNet.RemoteID.Remote_None; }; // 기타 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_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); }; }
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); }; }
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); }; }
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 // )); }; }
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 // )); }; }
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 )); }; }
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 // )); }; }