From 6cbff804b905a2b79967d7e0d363e48690a349ab Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Thu, 25 May 2023 18:30:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=20=E5=92=8C=20=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E7=AE=A1=E7=90=86=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/HaoYueTunnel/DesignTimeBuild/.dtbcache.v2 | Bin 124262 -> 124668 bytes ...0a4428b4-ee9a-43ba-8191-f076b1e55819.vsidx | Bin 0 -> 51657 bytes ...0bb77ab0-dd88-4efe-9fca-4316002cece6.vsidx | Bin 0 -> 48123 bytes ...0d6e9f1c-0ad9-4cba-8288-adecc01a5487.vsidx | Bin 36501 -> 0 bytes ...19cba2f7-6349-4434-947c-5e3eb587ed49.vsidx | Bin 35869 -> 0 bytes ...27599ba5-70bd-4b54-8cce-a9bca9e2f1cb.vsidx | Bin 36202 -> 0 bytes ...9a839e95-4e9d-43b2-b563-46a2d2493710.vsidx | Bin 35043 -> 0 bytes ...9c2e2e29-2b04-42ee-9948-aed7f262407b.vsidx | Bin 0 -> 50737 bytes ...dd414659-cf95-4718-99e0-2a9630f40bb8.vsidx | Bin 0 -> 52327 bytes .vs/HaoYueTunnel/v17/.suo | Bin 96768 -> 118784 bytes Client-Cli/Program.cs | 18 +- ClientCore/{AppLogic.cs => App.cs} | 6 + ClientCore/ClientCore.csproj | 2 +- ClientCore/Common/Helper.cs | 26 + .../Common/ProtoBufHelper.cs | 4 +- ClientCore/Event/DelegateClass.cs | 15 - ClientCore/Event/EEvent.cs | 16 + ClientCore/Event/EventSystem.cs | 245 +++ ClientCore/Manager/AppChat.cs | 19 +- ClientCore/Manager/AppLogin.cs | 5 +- ClientCore/Manager/LogManager.cs | 20 + ClientCore/Manager/UserMgr.cs | 90 + ClientCore/Network/NetMsg.cs | 94 + ClientCore/Network/NetworkHelper.cs | 10 +- Protobuf/ProtobufAuth.cs | 44 +- Protobuf/ProtobufTunnel.cs | 1595 +++++++++++++++++ Protobuf/ProtobufUDP.cs | 597 ++++++ ProtobufCore/out/ProtobufAuth.cs | 44 +- ProtobufCore/out/ProtobufTunnel.cs | 1595 +++++++++++++++++ ProtobufCore/out/ProtobufUDP.cs | 597 ++++++ ProtobufCore/proto/protobuf_Auth.proto | 13 +- ProtobufCore/proto/protobuf_Tunnel.proto | 56 + ProtobufCore/proto/protobuf_UDP.proto | 27 + Server/Program.cs | 4 +- .../Common/ProtoBufHelper.cs | 5 +- ServerCore/Event/EEvent.cs | 15 + ServerCore/Event/EventSystem.cs | 222 +++ ServerCore/Manager/ChatManager.cs | 14 +- ServerCore/Manager/ClientManager.cs | 39 +- ServerCore/Manager/LogManager.cs | 2 +- ServerCore/Manager/LoginManager.cs | 19 +- ServerCore/Manager/P2PUserManager.cs | 88 + ServerCore/Manager/ServerManager.cs | 8 +- ServerCore/NetWork/IOCPNetWork.cs | 14 +- ServerCore/NetWork/NetMsg.cs | 103 ++ 45 files changed, 5569 insertions(+), 102 deletions(-) create mode 100644 .vs/HaoYueTunnel/FileContentIndex/0a4428b4-ee9a-43ba-8191-f076b1e55819.vsidx create mode 100644 .vs/HaoYueTunnel/FileContentIndex/0bb77ab0-dd88-4efe-9fca-4316002cece6.vsidx delete mode 100644 .vs/HaoYueTunnel/FileContentIndex/0d6e9f1c-0ad9-4cba-8288-adecc01a5487.vsidx delete mode 100644 .vs/HaoYueTunnel/FileContentIndex/19cba2f7-6349-4434-947c-5e3eb587ed49.vsidx delete mode 100644 .vs/HaoYueTunnel/FileContentIndex/27599ba5-70bd-4b54-8cce-a9bca9e2f1cb.vsidx delete mode 100644 .vs/HaoYueTunnel/FileContentIndex/9a839e95-4e9d-43b2-b563-46a2d2493710.vsidx create mode 100644 .vs/HaoYueTunnel/FileContentIndex/9c2e2e29-2b04-42ee-9948-aed7f262407b.vsidx create mode 100644 .vs/HaoYueTunnel/FileContentIndex/dd414659-cf95-4718-99e0-2a9630f40bb8.vsidx rename ClientCore/{AppLogic.cs => App.cs} (76%) create mode 100644 ClientCore/Common/Helper.cs rename ServerCore/NetWork/NetBase.cs => ClientCore/Common/ProtoBufHelper.cs (85%) delete mode 100644 ClientCore/Event/DelegateClass.cs create mode 100644 ClientCore/Event/EEvent.cs create mode 100644 ClientCore/Event/EventSystem.cs create mode 100644 ClientCore/Manager/LogManager.cs create mode 100644 ClientCore/Manager/UserMgr.cs create mode 100644 ClientCore/Network/NetMsg.cs create mode 100644 Protobuf/ProtobufTunnel.cs create mode 100644 Protobuf/ProtobufUDP.cs create mode 100644 ProtobufCore/out/ProtobufTunnel.cs create mode 100644 ProtobufCore/out/ProtobufUDP.cs create mode 100644 ProtobufCore/proto/protobuf_Tunnel.proto create mode 100644 ProtobufCore/proto/protobuf_UDP.proto rename ClientCore/Network/NetBase.cs => ServerCore/Common/ProtoBufHelper.cs (85%) create mode 100644 ServerCore/Event/EEvent.cs create mode 100644 ServerCore/Event/EventSystem.cs create mode 100644 ServerCore/Manager/P2PUserManager.cs create mode 100644 ServerCore/NetWork/NetMsg.cs diff --git a/.vs/HaoYueTunnel/DesignTimeBuild/.dtbcache.v2 b/.vs/HaoYueTunnel/DesignTimeBuild/.dtbcache.v2 index 4bf14306a76d4ca4d79fabc56fe4f04ab475d59b..1cd3c8ff9732111c9ce6c9d37f4a317b6ca6d318 100644 GIT binary patch literal 124668 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

3SWUt{ zZn96Pu$q7!k+4si>{BZ2h=3iHuuq%pGb-$;fE|;t&zkIWD(skmjZ4_)P4)#9HZEYd zN!S-n_9Yc|n}FReVP7`cS5(;T0(OUlebr=NQ(<=q*qsvgYbN`36?Uh9-6dhaVY1&; zVRs4G-4ga&Ci}VygPC8uM!HABe%oZdU4@~xlD(nFPdr-pu$YkGEVGjz}>m=-tP4*oX_BsK3NW%Wa zWPhr{9ulyJCG5K<`!f~xuz=^-j zR>GLcURGhx3fOZJHes^=QDM&s*z*$h1C#x)3VU9_UXZXKn(P%7_JV-DC}BS`*^gD& zivsqNg#E;1ud1+@1ni9x_EVGnOohEsz}_TbKR1~XSLWZ|Bw%lruvna#D(uYy7LOl~ zy~Iw6U&H3a*~xG^CC=u;>C`xz2dC5GY(AV8#MwePEsC?#;j}o;mcVIgoSgxuGvjO- zoR-J$x#vrccgr_~cMDq)r*U>xoX%lq$3q=lj!(tGg`E?3ykOY5aahb*8MkXd_=Q`N z*5wHE&8a%VTpsQM!_JF0++cpi-C)?NIAN>dI3Lp5;|asoz~6OTVb}$LzYy+!pRkMI z6!3as7st`bgqAXo?gg$Fw0=q1w?XB*)GxDoCp^W-GnG4G@epO%JCi`|<>-&Xz)d|QS0PQ#}K zEdt)U!XOQw7H*K`(jX0=7H*J+PYarX`-s~_!>7fzL&K*pcd|DKPG<;eVgEV|v6oWK;S`>pcd|DKPG<;eVgEV|v6oWK; zS`>pcd|DKPG<;eVgZy9cY5B6_)A9r1(}EFO*d}yoxgy-9Wj15Be0Qp@Dwh&=CAb{a z@mOgDZTZy>+QK%2=gC!&{{FBn>}t4F&sl}QJs!1%b;HA3;OK!X-y^IS$UZo>!m$mG z?QrzNE%0i&22Me*mUC=BmL2wKr+wPxdbNmnE^K!k0t4)hHzK;gD)b5rlCT1ZvyeCo zh_jJ68;Em|I0uMxkvJEKl}M}vq7l&rjBo{7qv6;BMrb&;fDsywEntM#$g$-qwud{b zfWP6MI2+)<;H+{jcUIXOXM^CZ0yn~)Ri0u)aXlejpi!}7y6lUy{lM}w_PP^0z@3M& z$>IMR4lo!BO}IBSg1TU)XgI*wWdp<2@qY~m7{?CFgh3h(Fm}d(4ya8u9AIoaG=jP) z6Fv1Zd>}7Nj7~x{H#>GHfg2W|2T#Ce{ zKs5F;0wZiiYitE#8xk-X*VxMlV!t-_GJ>d-jlGOKdl?;PqY%<%G|qBy`~|0%Lp-F* z;W*2K2MS#BhIAR@UNWgT8;i37|AhyN+)JhuXSc!wa3kDHrV-KwoHQES6hVI)8gb#f z)7Yj62N>Y9A`H^lridG4nKVdan<8$ImC_)w#x_M*WE$HPVZPv7mD)sOn3zu8w7^QHqqFo$hN~SVUWf)MYchPgh3kH6xjy3Q5dAL zO_6Po#x_ODnptC;BE=w$ZHg3wG`1;H4AR)9NHIubn zE`!su3A!9k%O~iHCdkO6$bSt6T2;EL-KcUwUx`WW2gzh4AH=%n79U$~t zLiZ9nNazru`v~1n=mA2nBlLPgZy@wWLWc>xiO`z~JxJ&+geD115t=46L#Rb)me3JG zM+waldWg`&gysnyBeXzhkEpf2t7*ZF+#@)y^YY@3B7~RI|;pu z(7Or!|I-7d3f?3&a3fLTv>bs;^&C)+!XwAv7>DCFz(E+6+u;-l!$Rlty@l?u9Z>GH zPj|U~DDR>_?3>?x@ZYN-bEntlvv_=mQy-4%|(T7AI5Dm8zFhUxw0pG5$3=$2u6EH%uY7^D$MMKMStkcwiEMj#c%AdNsOia{EIR1||W0;wnlfypSlLz0nx)K8e~ zNmGHrRFw_0B^T)SB4DEu_PohnP+_A2mXoj- xP4>J5dbMa63^9(r`Ob4AO8rQ4G>>J5dbsE97?a{{ZVL^mG6K literal 124262 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 bpy&KI^p*d)%HQ4WOgFshNj?ARzMlUN7RvTk diff --git a/.vs/HaoYueTunnel/FileContentIndex/9a839e95-4e9d-43b2-b563-46a2d2493710.vsidx b/.vs/HaoYueTunnel/FileContentIndex/9a839e95-4e9d-43b2-b563-46a2d2493710.vsidx deleted file mode 100644 index 96255602909bb0d5a566f15b7649f0d807c7319d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35043 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 E0eqi#VE_OC diff --git a/.vs/HaoYueTunnel/FileContentIndex/9c2e2e29-2b04-42ee-9948-aed7f262407b.vsidx b/.vs/HaoYueTunnel/FileContentIndex/9c2e2e29-2b04-42ee-9948-aed7f262407b.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..c1e57ae2b658f55de4e093dd581b64c10902485e GIT binary patch literal 50737 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 literal 0 HcmV?d00001 diff --git a/.vs/HaoYueTunnel/FileContentIndex/dd414659-cf95-4718-99e0-2a9630f40bb8.vsidx b/.vs/HaoYueTunnel/FileContentIndex/dd414659-cf95-4718-99e0-2a9630f40bb8.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..febfcc5f83999987c01fcbd7e757ac1e29d7ccc2 GIT binary patch literal 52327 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 literal 0 HcmV?d00001 diff --git a/.vs/HaoYueTunnel/v17/.suo b/.vs/HaoYueTunnel/v17/.suo index 4e6d5120011d6ea2927bc1e0af8ad496f9f8d2ba..00c878d639f00b7c13fc39454be28770d5c670ac 100644 GIT binary patch delta 15044 zcmeHO3tZJj_W#Z0-pjo_gv(1*h&LjFaCyIk3l|WJr=q!utAIQ#9#;f2H9@U)%`#!q z-|o65pqBPjsHm*KM=y6v?cr`)TUu(nww2~%)7AKY&+p#L8#QaU_W#+@!_1sHGr#$r z`OcX$^PAgnPSMb8xh~X8CYXY~AcP`m0s5}HyPLR_4%?MCMm8dJ$JF=EuKj=|g4315 z7b_RDM1EdYubdA?AmfWI7Tdmwq}&~U5S%%aJ2o2R^(tg+K-6RmVl4>C?j*#%ppl@P zKyyGLAT`JmG#)exM6zQ|aX4ZhkUuC8L~Z^ZF+I}@gf|dkL1RD;pddjg6-FT82BL

%%GxD0oyzx9ht#kh6fWq0xd-A*0 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≧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 Inbhom066&{{{R30 diff --git a/Client-Cli/Program.cs b/Client-Cli/Program.cs index 30e119f..d987a77 100644 --- a/Client-Cli/Program.cs +++ b/Client-Cli/Program.cs @@ -1,8 +1,13 @@ using ClientCore; +using ClientCore.Event; + App.Init("127.0.0.1", 23846); -//注册 -App.chat.OnChatMsg += OnChatMsg; +//注册事件 +EventSystem.Instance.RegisterEvent(EEvent.UserJoin, OnUserJoin); +EventSystem.Instance.RegisterEvent(EEvent.UserLeave, OnUserLeave); + +EventSystem.Instance.RegisterEvent(EEvent.OnChatMsg, OnChatMsg); while (true) { @@ -38,4 +43,13 @@ while (true) void OnChatMsg(string str1, string str2) { Console.WriteLine($"[Chat]{str1}:{str2}"); +} + +void OnUserJoin(long UID) +{ + Console.WriteLine($"[User]用户{UID}上线"); +} +void OnUserLeave(long UID) +{ + Console.WriteLine($"[User]用户{UID}下线"); } \ No newline at end of file diff --git a/ClientCore/AppLogic.cs b/ClientCore/App.cs similarity index 76% rename from ClientCore/AppLogic.cs rename to ClientCore/App.cs index aa5d724..f6779b0 100644 --- a/ClientCore/AppLogic.cs +++ b/ClientCore/App.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using ClientCore.Manager; +using ClientCore.Network; namespace ClientCore { @@ -12,15 +14,19 @@ namespace ClientCore public static long RID = -1; public static string IP; public static int Port; + public static LogManager log; public static NetworkHelper networkHelper; public static AppLogin login; public static AppChat chat; + public static UserMgr userMgr; public static void Init(string IP, int port) { + log = new LogManager(); networkHelper = new NetworkHelper(); login = new AppLogin(); chat = new AppChat(); + userMgr = new UserMgr(); networkHelper.Init(IP, port); } } diff --git a/ClientCore/ClientCore.csproj b/ClientCore/ClientCore.csproj index 097ad1f..100b8df 100644 --- a/ClientCore/ClientCore.csproj +++ b/ClientCore/ClientCore.csproj @@ -1,4 +1,4 @@ - + net7.0 diff --git a/ClientCore/Common/Helper.cs b/ClientCore/Common/Helper.cs new file mode 100644 index 0000000..0643fd4 --- /dev/null +++ b/ClientCore/Common/Helper.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClientCore.Common +{ + public static class Helper + { + public static long GetNowTimeStamp() + { + return GetTimeStamp(DateTime.Now); + } + + ///

+ /// 获取时间戳 + /// + /// + public static long GetTimeStamp(DateTime dt) + { + TimeSpan ts = dt - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalSeconds); + } + } +} diff --git a/ServerCore/NetWork/NetBase.cs b/ClientCore/Common/ProtoBufHelper.cs similarity index 85% rename from ServerCore/NetWork/NetBase.cs rename to ClientCore/Common/ProtoBufHelper.cs index b8728d7..27e19a4 100644 --- a/ServerCore/NetWork/NetBase.cs +++ b/ClientCore/Common/ProtoBufHelper.cs @@ -1,8 +1,8 @@ using Google.Protobuf; -namespace ServerCore +namespace ClientCore.Common { - public static class NetBase + public static class ProtoBufHelper { public static byte[] Serizlize(IMessage msg) diff --git a/ClientCore/Event/DelegateClass.cs b/ClientCore/Event/DelegateClass.cs deleted file mode 100644 index 3c972cb..0000000 --- a/ClientCore/Event/DelegateClass.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static HaoYueNet.ClientNetwork.NetworkHelperCore; - -namespace ClientCore.Event -{ - public class DelegateClass - { - public delegate void dg_Str(string Msg); - public delegate void dg_Str_Str(string Str1, string Str2); - } -} diff --git a/ClientCore/Event/EEvent.cs b/ClientCore/Event/EEvent.cs new file mode 100644 index 0000000..b0969be --- /dev/null +++ b/ClientCore/Event/EEvent.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClientCore.Event +{ + public enum EEvent + { + // 添加你自己需要的事件类型 + UserJoin, + UserLeave, + OnChatMsg, + } +} diff --git a/ClientCore/Event/EventSystem.cs b/ClientCore/Event/EventSystem.cs new file mode 100644 index 0000000..dc0ee60 --- /dev/null +++ b/ClientCore/Event/EventSystem.cs @@ -0,0 +1,245 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClientCore.Event +{ + public class EventData + { + private static long BaseUid = 0; + private static long GenUid() + { + return (++BaseUid); + } + + /// + /// 唯一id + /// + public long uid { get; private set; } + + /// + /// 回调 + /// + public Delegate callback { get; private set; } + + public EventData(Delegate d) + { + uid = GenUid(); + callback = d; + } + } + + public class EventSystem + { + private static EventSystem instance = new EventSystem(); + public static EventSystem Instance { get { return instance; } } + + private Dictionary> eventDic = new Dictionary>(128); + + private EventSystem() { } + + + #region RegisterEvent + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + private void InterRegisterEvent(EEvent evt, Delegate callback) + { + if (eventDic.ContainsKey(evt)) + { + if (eventDic[evt].IndexOf(callback) < 0) + { + eventDic[evt].Add(callback); + } + } + else + { + eventDic.Add(evt, new List() { callback }); + } + } + #endregion + + #region UnregisterEvent + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + private void InterUnregisterEvent(EEvent evt, Delegate callback) + { + if (eventDic.ContainsKey(evt)) + { + eventDic[evt].Remove(callback); + if (eventDic[evt].Count == 0) eventDic.Remove(evt); + } + } + #endregion + + #region PostEvent + public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3, T4 arg4) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2, arg3, arg4); + } + catch (Exception e) + { + App.log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2, arg3); + } + catch (Exception e) + { + App.log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T1 arg1, T2 arg2) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2); + } + catch (Exception e) + { + App.log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T arg) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg); + } + catch (Exception e) + { + App.log.Error(e.Message + ", method name : " + callback.Method); + } + } + } + + } + + public void PostEvent(EEvent evt) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(); + } + catch (Exception e) + { + App.log.Error(e.Message); + } + } + } + } + #endregion + + /// + /// 获取所有事件 + /// + /// + /// + private List GetEventList(EEvent evt) + { + if (eventDic.ContainsKey(evt)) + { + List tempList = eventDic[evt]; + if (null != tempList) + { + return tempList; + } + } + return null; + } + } +} diff --git a/ClientCore/Manager/AppChat.cs b/ClientCore/Manager/AppChat.cs index 9aab586..0e0bdb9 100644 --- a/ClientCore/Manager/AppChat.cs +++ b/ClientCore/Manager/AppChat.cs @@ -1,13 +1,16 @@ using AxibugProtobuf; -using System.Net.Sockets; -using static ClientCore.Event.DelegateClass; -using static HaoYueNet.ClientNetwork.NetworkHelperCore; +using ClientCore.Common; +using ClientCore.Event; +using ClientCore.Network; -namespace ClientCore +namespace ClientCore.Manager { public class AppChat { - public event dg_Str_Str OnChatMsg; + public AppChat() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdChatmsg, RecvChatMsg); + } public void SendChatMsg(string ChatMsg) { @@ -15,13 +18,13 @@ namespace ClientCore { ChatMsg = ChatMsg, }; - App.networkHelper.SendToServer((int)CommandID.CmdChatmsg, NetBase.Serizlize(msg)); + App.networkHelper.SendToServer((int)CommandID.CmdChatmsg, ProtoBufHelper.Serizlize(msg)); } public void RecvChatMsg(byte[] reqData) { - Protobuf_ChatMsg_RESP msg = NetBase.DeSerizlize(reqData); - OnChatMsg(msg.NickName, msg.ChatMsg); + Protobuf_ChatMsg_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + EventSystem.Instance.PostEvent(EEvent.OnChatMsg, msg.NickName, msg.ChatMsg); } } } diff --git a/ClientCore/Manager/AppLogin.cs b/ClientCore/Manager/AppLogin.cs index 268e278..aa34bd8 100644 --- a/ClientCore/Manager/AppLogin.cs +++ b/ClientCore/Manager/AppLogin.cs @@ -1,6 +1,7 @@ using AxibugProtobuf; +using ClientCore.Common; -namespace ClientCore +namespace ClientCore.Manager { public class AppLogin { @@ -11,7 +12,7 @@ namespace ClientCore LoginType = 0, Account = Account, }; - App.networkHelper.SendToServer((int)CommandID.CmdLogin, NetBase.Serizlize(msg)); + App.networkHelper.SendToServer((int)CommandID.CmdLogin, ProtoBufHelper.Serizlize(msg)); } } } diff --git a/ClientCore/Manager/LogManager.cs b/ClientCore/Manager/LogManager.cs new file mode 100644 index 0000000..612ec1b --- /dev/null +++ b/ClientCore/Manager/LogManager.cs @@ -0,0 +1,20 @@ +namespace ClientCore.Manager +{ + public class LogManager + { + public void Debug(string str) + { + Console.WriteLine(str); + } + + public void Warning(string str) + { + Console.WriteLine(str); + } + + public void Error(string str) + { + Console.WriteLine(str); + } + } +} \ No newline at end of file diff --git a/ClientCore/Manager/UserMgr.cs b/ClientCore/Manager/UserMgr.cs new file mode 100644 index 0000000..facb5ce --- /dev/null +++ b/ClientCore/Manager/UserMgr.cs @@ -0,0 +1,90 @@ +using AxibugProtobuf; +using ClientCore.Common; +using ClientCore.Event; +using ClientCore.Network; +using System; +using System.Security.Cryptography; + +namespace ClientCore.Manager +{ + public class UserInfo + { + public long UID;//用户ID + public string NickName;//昵称 + public int State;//状态 + } + + public class UserMgr + { + public Dictionary DictUID2User = new Dictionary(); + public UserMgr() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdUserOnlinelist, RecvUserOnlinelist); + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdUserJoin, RecvCmdUserJoin); + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdUserLeave, RecvGetUserLeave); + } + + public void RecvUserOnlinelist(byte[] reqData) + { + Protobuf_UserList_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + + for(int i = 0;i < msg.UserList.Count;i++) + { + UserMiniInfo mi = msg.UserList[i]; + UpdateOrAddUser(mi); + } + } + public void RecvCmdUserJoin(byte[] reqData) + { + Protobuf_UserJoin_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + UpdateOrAddUser(msg.UserInfo); + } + + public void RecvGetUserLeave(byte[] reqData) + { + Protobuf_UserLeave_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + RemoveUser(msg.UID); + } + + public void UpdateOrAddUser(UserMiniInfo minfo) + { + lock (DictUID2User) + { + if (!DictUID2User.ContainsKey(minfo.UID)) + { + DictUID2User[minfo.UID] = new UserInfo() + { + UID = minfo.UID, + State = minfo.State, + NickName = minfo.NickName, + }; + } + else + { + DictUID2User[minfo.UID].State = minfo.State; + DictUID2User[minfo.UID].NickName= minfo.NickName; + } + } + //抛出用户加入事件 + EventSystem.Instance.PostEvent(EEvent.UserJoin, minfo.UID); + } + + public void RemoveUser(long UID) + { + bool bflag = false; + lock (DictUID2User) + { + if (DictUID2User.ContainsKey(UID)) + { + DictUID2User.Remove(UID); + bflag = true; + } + } + if (bflag) + { + //抛出用户离开事件 + EventSystem.Instance.PostEvent(EEvent.UserLeave, UID); + } + } + } +} diff --git a/ClientCore/Network/NetMsg.cs b/ClientCore/Network/NetMsg.cs new file mode 100644 index 0000000..f2f2d74 --- /dev/null +++ b/ClientCore/Network/NetMsg.cs @@ -0,0 +1,94 @@ +namespace ClientCore.Network +{ + + public class NetMsg + { + private static NetMsg instance = new NetMsg(); + public static NetMsg Instance { get { return instance; } } + + private Dictionary> netEventDic = new Dictionary>(128); + + private NetMsg() { } + + + #region RegisterMsgEvent + + public void RegNetMsgEvent(int cmd, Action callback) + { + InterRegNetMsgEvent(cmd, callback); + } + + private void InterRegNetMsgEvent(int cmd, Delegate callback) + { + if (netEventDic.ContainsKey(cmd)) + { + if (netEventDic[cmd].IndexOf(callback) < 0) + { + netEventDic[cmd].Add(callback); + } + } + else + { + netEventDic.Add(cmd, new List() { callback }); + } + } + #endregion + + #region UnregisterCMD + + public void UnregisterCMD(int evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterCMD(evt, tempDelegate); + } + + private void InterUnregisterCMD(int cmd, Delegate callback) + { + if (netEventDic.ContainsKey(cmd)) + { + netEventDic[cmd].Remove(callback); + if (netEventDic[cmd].Count == 0) netEventDic.Remove(cmd); + } + } + #endregion + + #region PostEvent + public void PostNetMsgEvent(int cmd, byte[] arg) + { + List eventList = GetNetEventDicList(cmd); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg); + } + catch (Exception e) + { + App.log.Error(e.Message); + } + } + } + } + #endregion + + /// + /// 获取所有事件 + /// + /// + /// + private List GetNetEventDicList(int cmd) + { + if (netEventDic.ContainsKey(cmd)) + { + List tempList = netEventDic[cmd]; + if (null != tempList) + { + return tempList; + } + } + return null; + } + } +} diff --git a/ClientCore/Network/NetworkHelper.cs b/ClientCore/Network/NetworkHelper.cs index f3a7898..4c45fcc 100644 --- a/ClientCore/Network/NetworkHelper.cs +++ b/ClientCore/Network/NetworkHelper.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ClientCore +namespace ClientCore.Network { /// /// 继承网络库,以支持网络功能 @@ -55,12 +55,8 @@ namespace ClientCore NetworkDeBugLog("收到消息 CMDID =>" + CMDID + " ERRCODE =>" + ERRCODE + " 数据长度=>" + data.Length); try { - //根据协议ID走不同逻辑 - switch ((CommandID)CMDID) - { - case CommandID.CmdLogin: break; - case CommandID.CmdChatmsg: App.chat.RecvChatMsg(data); break; - } + //抛出网络数据 + NetMsg.Instance.PostNetMsgEvent(CMDID, data); } catch (Exception ex) { diff --git a/Protobuf/ProtobufAuth.cs b/Protobuf/ProtobufAuth.cs index 2ab2650..cfbdef9 100644 --- a/Protobuf/ProtobufAuth.cs +++ b/Protobuf/ProtobufAuth.cs @@ -33,15 +33,17 @@ namespace AxibugProtobuf { "dHVzGAQgASgOMiEuQXhpYnVnUHJvdG9idWYuTG9naW5SZXN1bHRTdGF0dXMi", "IwoQUHJvdG9idWZfQ2hhdE1zZxIPCgdDaGF0TXNnGAEgASgJIkgKFVByb3Rv", "YnVmX0NoYXRNc2dfUkVTUBIQCghOaWNrTmFtZRgBIAEoCRIPCgdDaGF0TXNn", - "GAIgASgJEgwKBERhdGUYAyABKAMqPQoJQ29tbWFuZElEEg4KCkNNRF9ERUZB", - "VUwQABIOCglDTURfTE9HSU4Q0Q8SEAoLQ01EX0NIQVRNU0cQoR8qKwoJRXJy", - "b3JDb2RlEhAKDEVSUk9SX0RFRkFVTBAAEgwKCEVSUk9SX09LEAEqPgoJTG9n", - "aW5UeXBlEg8KC0Jhc2VEZWZhdWx0EAASDgoKSGFvWXVlQXV0aBABEgcKA0JG", - "MxADEgcKA0JGNBAEKksKCkRldmljZVR5cGUSFgoSRGV2aWNlVHlwZV9EZWZh", - "dWx0EAASBgoCUEMQARILCgdBbmRyb2lkEAISBwoDSU9TEAMSBwoDUFNWEAQq", - "TgoRTG9naW5SZXN1bHRTdGF0dXMSIQodTG9naW5SZXN1bHRTdGF0dXNfQmFz", - "ZURlZmF1bHQQABIGCgJPSxABEg4KCkFjY291bnRFcnIQAkICSAFiBnByb3Rv", - "Mw==")); + "GAIgASgJEgwKBERhdGUYAyABKAMqnAEKCUNvbW1hbmRJRBIOCgpDTURfREVG", + "QVVMEAASDgoJQ01EX0xPR0lOENAPEhAKC0NNRF9DSEFUTVNHEKAfEhgKE0NN", + "RF9VU0VSX09OTElORUxJU1QQiCcSEgoNQ01EX1VTRVJfSk9JThCnJxITCg5D", + "TURfVVNFUl9MRUFWRRCoJxIaChVDTURfVVNFUl9TVEFURV9VUERBVEUQqScq", + "KwoJRXJyb3JDb2RlEhAKDEVSUk9SX0RFRkFVTBAAEgwKCEVSUk9SX09LEAEq", + "PgoJTG9naW5UeXBlEg8KC0Jhc2VEZWZhdWx0EAASDgoKSGFvWXVlQXV0aBAB", + "EgcKA0JGMxADEgcKA0JGNBAEKksKCkRldmljZVR5cGUSFgoSRGV2aWNlVHlw", + "ZV9EZWZhdWx0EAASBgoCUEMQARILCgdBbmRyb2lkEAISBwoDSU9TEAMSBwoD", + "UFNWEAQqTgoRTG9naW5SZXN1bHRTdGF0dXMSIQodTG9naW5SZXN1bHRTdGF0", + "dXNfQmFzZURlZmF1bHQQABIGCgJPSxABEg4KCkFjY291bnRFcnIQAkICSAFi", + "BnByb3RvMw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -61,13 +63,29 @@ namespace AxibugProtobuf { /// [pbr::OriginalName("CMD_DEFAUL")] CmdDefaul = 0, /// - ///登录上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP + ///登录 上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP /// - [pbr::OriginalName("CMD_LOGIN")] CmdLogin = 2001, + [pbr::OriginalName("CMD_LOGIN")] CmdLogin = 2000, /// - ///登录上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP + ///聊天 上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP /// - [pbr::OriginalName("CMD_CHATMSG")] CmdChatmsg = 4001, + [pbr::OriginalName("CMD_CHATMSG")] CmdChatmsg = 4000, + /// + ///获取在线用户列表 上行 | 下行 对应 Protobuf_UserList | Protobuf_UserList_RESP + /// + [pbr::OriginalName("CMD_USER_ONLINELIST")] CmdUserOnlinelist = 5000, + /// + ///用户上线 下行 对应 Protobuf_UserOnline_RESP + /// + [pbr::OriginalName("CMD_USER_JOIN")] CmdUserJoin = 5031, + /// + ///用户下线 下行 对应 Protobuf_UserOffline_RESP + /// + [pbr::OriginalName("CMD_USER_LEAVE")] CmdUserLeave = 5032, + /// + ///更新在线用户状态 下行 对应 Protobuf_UserState_RESP + /// + [pbr::OriginalName("CMD_USER_STATE_UPDATE")] CmdUserStateUpdate = 5033, } public enum ErrorCode { diff --git a/Protobuf/ProtobufTunnel.cs b/Protobuf/ProtobufTunnel.cs new file mode 100644 index 0000000..c131ca5 --- /dev/null +++ b/Protobuf/ProtobufTunnel.cs @@ -0,0 +1,1595 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_Tunnel.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_Tunnel.proto + public static partial class ProtobufTunnelReflection { + + #region Descriptor + /// File descriptor for protobuf_Tunnel.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufTunnelReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChVwcm90b2J1Zl9UdW5uZWwucHJvdG8SDkF4aWJ1Z1Byb3RvYnVmIhMKEVBy", + "b3RvYnVmX1VzZXJMaXN0IlsKFlByb3RvYnVmX1VzZXJMaXN0X1JFU1ASEQoJ", + "VXNlckNvdW50GAEgASgFEi4KCFVzZXJMaXN0GAIgAygLMhwuQXhpYnVnUHJv", + "dG9idWYuVXNlck1pbmlJbmZvIkgKFlByb3RvYnVmX1VzZXJKb2luX1JFU1AS", + "LgoIVXNlckluZm8YASABKAsyHC5BeGlidWdQcm90b2J1Zi5Vc2VyTWluaUlu", + "Zm8iJgoXUHJvdG9idWZfVXNlckxlYXZlX1JFU1ASCwoDVUlEGAEgASgDIjUK", + "F1Byb3RvYnVmX1VzZXJTdGF0ZV9SRVNQEgsKA1VJRBgBIAEoAxINCgVTdGF0", + "ZRgCIAEoBSI8CgxVc2VyTWluaUluZm8SCwoDVUlEGAEgASgDEhAKCE5pY2tO", + "YW1lGAIgASgJEg0KBVN0YXRlGAMgASgFIhkKF1Byb3RvYnVmX1VEUFNlcnZl", + "cl9JbmZvIkYKHFByb3RvYnVmX1VEUFNlcnZlcl9JbmZvX1JFU1ASEQoJVURQ", + "U2V2X0lQGAEgASgJEhMKC1VEUFNldl9Qb3J0GAIgASgFQgJIAWIGcHJvdG8z")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserList), global::AxibugProtobuf.Protobuf_UserList.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserList_RESP), global::AxibugProtobuf.Protobuf_UserList_RESP.Parser, new[]{ "UserCount", "UserList" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserJoin_RESP), global::AxibugProtobuf.Protobuf_UserJoin_RESP.Parser, new[]{ "UserInfo" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserLeave_RESP), global::AxibugProtobuf.Protobuf_UserLeave_RESP.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserState_RESP), global::AxibugProtobuf.Protobuf_UserState_RESP.Parser, new[]{ "UID", "State" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.UserMiniInfo), global::AxibugProtobuf.UserMiniInfo.Parser, new[]{ "UID", "NickName", "State" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDPServer_Info), global::AxibugProtobuf.Protobuf_UDPServer_Info.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDPServer_Info_RESP), global::AxibugProtobuf.Protobuf_UDPServer_Info_RESP.Parser, new[]{ "UDPSevIP", "UDPSevPort" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///获取在线用户列表 上行 + /// + public sealed partial class Protobuf_UserList : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserList()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList(Protobuf_UserList other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList Clone() { + return new Protobuf_UserList(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserList); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserList other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserList other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + /// + ///获取在线用户列表 下行 + /// + public sealed partial class Protobuf_UserList_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserList_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList_RESP(Protobuf_UserList_RESP other) : this() { + userCount_ = other.userCount_; + userList_ = other.userList_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList_RESP Clone() { + return new Protobuf_UserList_RESP(this); + } + + /// Field number for the "UserCount" field. + public const int UserCountFieldNumber = 1; + private int userCount_; + /// + ///玩家数量 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int UserCount { + get { return userCount_; } + set { + userCount_ = value; + } + } + + /// Field number for the "UserList" field. + public const int UserListFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_userList_codec + = pb::FieldCodec.ForMessage(18, global::AxibugProtobuf.UserMiniInfo.Parser); + private readonly pbc::RepeatedField userList_ = new pbc::RepeatedField(); + /// + ///用户列表 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pbc::RepeatedField UserList { + get { return userList_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserList_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserList_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UserCount != other.UserCount) return false; + if(!userList_.Equals(other.userList_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UserCount != 0) hash ^= UserCount.GetHashCode(); + hash ^= userList_.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UserCount != 0) { + output.WriteRawTag(8); + output.WriteInt32(UserCount); + } + userList_.WriteTo(output, _repeated_userList_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UserCount != 0) { + output.WriteRawTag(8); + output.WriteInt32(UserCount); + } + userList_.WriteTo(ref output, _repeated_userList_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UserCount != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(UserCount); + } + size += userList_.CalculateSize(_repeated_userList_codec); + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserList_RESP other) { + if (other == null) { + return; + } + if (other.UserCount != 0) { + UserCount = other.UserCount; + } + userList_.Add(other.userList_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UserCount = input.ReadInt32(); + break; + } + case 18: { + userList_.AddEntriesFrom(input, _repeated_userList_codec); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UserCount = input.ReadInt32(); + break; + } + case 18: { + userList_.AddEntriesFrom(ref input, _repeated_userList_codec); + break; + } + } + } + } + #endif + + } + + /// + ///用户上线 下行 + /// + public sealed partial class Protobuf_UserJoin_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserJoin_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserJoin_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserJoin_RESP(Protobuf_UserJoin_RESP other) : this() { + userInfo_ = other.userInfo_ != null ? other.userInfo_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserJoin_RESP Clone() { + return new Protobuf_UserJoin_RESP(this); + } + + /// Field number for the "UserInfo" field. + public const int UserInfoFieldNumber = 1; + private global::AxibugProtobuf.UserMiniInfo userInfo_; + /// + ///用户 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::AxibugProtobuf.UserMiniInfo UserInfo { + get { return userInfo_; } + set { + userInfo_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserJoin_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserJoin_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!object.Equals(UserInfo, other.UserInfo)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (userInfo_ != null) hash ^= UserInfo.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (userInfo_ != null) { + output.WriteRawTag(10); + output.WriteMessage(UserInfo); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (userInfo_ != null) { + output.WriteRawTag(10); + output.WriteMessage(UserInfo); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (userInfo_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(UserInfo); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserJoin_RESP other) { + if (other == null) { + return; + } + if (other.userInfo_ != null) { + if (userInfo_ == null) { + UserInfo = new global::AxibugProtobuf.UserMiniInfo(); + } + UserInfo.MergeFrom(other.UserInfo); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (userInfo_ == null) { + UserInfo = new global::AxibugProtobuf.UserMiniInfo(); + } + input.ReadMessage(UserInfo); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + if (userInfo_ == null) { + UserInfo = new global::AxibugProtobuf.UserMiniInfo(); + } + input.ReadMessage(UserInfo); + break; + } + } + } + } + #endif + + } + + /// + ///用户下线 下行 + /// + public sealed partial class Protobuf_UserLeave_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserLeave_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserLeave_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserLeave_RESP(Protobuf_UserLeave_RESP other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserLeave_RESP Clone() { + return new Protobuf_UserLeave_RESP(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserLeave_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserLeave_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserLeave_RESP other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///更新在线用户状态 下行 + /// + public sealed partial class Protobuf_UserState_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserState_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserState_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserState_RESP(Protobuf_UserState_RESP other) : this() { + uID_ = other.uID_; + state_ = other.state_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserState_RESP Clone() { + return new Protobuf_UserState_RESP(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + /// Field number for the "State" field. + public const int StateFieldNumber = 2; + private int state_; + /// + ///状态 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int State { + get { return state_; } + set { + state_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserState_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserState_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + if (State != other.State) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (State != 0) hash ^= State.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (State != 0) { + output.WriteRawTag(16); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (State != 0) { + output.WriteRawTag(16); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (State != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(State); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserState_RESP other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + if (other.State != 0) { + State = other.State; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + State = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + State = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + public sealed partial class UserMiniInfo : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new UserMiniInfo()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public UserMiniInfo() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public UserMiniInfo(UserMiniInfo other) : this() { + uID_ = other.uID_; + nickName_ = other.nickName_; + state_ = other.state_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public UserMiniInfo Clone() { + return new UserMiniInfo(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + /// Field number for the "NickName" field. + public const int NickNameFieldNumber = 2; + private string nickName_ = ""; + /// + ///昵称 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string NickName { + get { return nickName_; } + set { + nickName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "State" field. + public const int StateFieldNumber = 3; + private int state_; + /// + ///状态 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int State { + get { return state_; } + set { + state_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as UserMiniInfo); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(UserMiniInfo other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + if (NickName != other.NickName) return false; + if (State != other.State) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (NickName.Length != 0) hash ^= NickName.GetHashCode(); + if (State != 0) hash ^= State.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (NickName.Length != 0) { + output.WriteRawTag(18); + output.WriteString(NickName); + } + if (State != 0) { + output.WriteRawTag(24); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (NickName.Length != 0) { + output.WriteRawTag(18); + output.WriteString(NickName); + } + if (State != 0) { + output.WriteRawTag(24); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (NickName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(NickName); + } + if (State != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(State); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(UserMiniInfo other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + if (other.NickName.Length != 0) { + NickName = other.NickName; + } + if (other.State != 0) { + State = other.State; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 18: { + NickName = input.ReadString(); + break; + } + case 24: { + State = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 18: { + NickName = input.ReadString(); + break; + } + case 24: { + State = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + /// + ///UDP服务器信息 上行 + /// + public sealed partial class Protobuf_UDPServer_Info : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDPServer_Info()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[6]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info(Protobuf_UDPServer_Info other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info Clone() { + return new Protobuf_UDPServer_Info(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDPServer_Info); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDPServer_Info other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDPServer_Info other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + /// + ///UDP服务器信息 下行 + /// + public sealed partial class Protobuf_UDPServer_Info_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDPServer_Info_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[7]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info_RESP(Protobuf_UDPServer_Info_RESP other) : this() { + uDPSevIP_ = other.uDPSevIP_; + uDPSevPort_ = other.uDPSevPort_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info_RESP Clone() { + return new Protobuf_UDPServer_Info_RESP(this); + } + + /// Field number for the "UDPSev_IP" field. + public const int UDPSevIPFieldNumber = 1; + private string uDPSevIP_ = ""; + /// + ///UDP服务器IP + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string UDPSevIP { + get { return uDPSevIP_; } + set { + uDPSevIP_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "UDPSev_Port" field. + public const int UDPSevPortFieldNumber = 2; + private int uDPSevPort_; + /// + ///UDP服务器端口 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int UDPSevPort { + get { return uDPSevPort_; } + set { + uDPSevPort_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDPServer_Info_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDPServer_Info_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UDPSevIP != other.UDPSevIP) return false; + if (UDPSevPort != other.UDPSevPort) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UDPSevIP.Length != 0) hash ^= UDPSevIP.GetHashCode(); + if (UDPSevPort != 0) hash ^= UDPSevPort.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UDPSevIP.Length != 0) { + output.WriteRawTag(10); + output.WriteString(UDPSevIP); + } + if (UDPSevPort != 0) { + output.WriteRawTag(16); + output.WriteInt32(UDPSevPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UDPSevIP.Length != 0) { + output.WriteRawTag(10); + output.WriteString(UDPSevIP); + } + if (UDPSevPort != 0) { + output.WriteRawTag(16); + output.WriteInt32(UDPSevPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UDPSevIP.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(UDPSevIP); + } + if (UDPSevPort != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(UDPSevPort); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDPServer_Info_RESP other) { + if (other == null) { + return; + } + if (other.UDPSevIP.Length != 0) { + UDPSevIP = other.UDPSevIP; + } + if (other.UDPSevPort != 0) { + UDPSevPort = other.UDPSevPort; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + UDPSevIP = input.ReadString(); + break; + } + case 16: { + UDPSevPort = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + UDPSevIP = input.ReadString(); + break; + } + case 16: { + UDPSevPort = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Protobuf/ProtobufUDP.cs b/Protobuf/ProtobufUDP.cs new file mode 100644 index 0000000..379c01b --- /dev/null +++ b/Protobuf/ProtobufUDP.cs @@ -0,0 +1,597 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_UDP.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_UDP.proto + public static partial class ProtobufUDPReflection { + + #region Descriptor + /// File descriptor for protobuf_UDP.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufUDPReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChJwcm90b2J1Zl9VRFAucHJvdG8SDkF4aWJ1Z1Byb3RvYnVmIisKHFByb3Rv", + "YnVmX1VEUF9UT19TRVJWRVJfSEVMTE8SCwoDVUlEGAEgASgDIjAKIVByb3Rv", + "YnVmX1VEUF9UT19TRVJWRVJfSEVMTE9fUkVTUBILCgNVSUQYASABKAMiJQoW", + "UHJvdG9idWZfVURQX1AyUF9IRUxMTxILCgNVSUQYASABKAMqQAoMVURQQ29t", + "bWFuZElEEhIKDkNNRF9VRFBfREVGQVVMEAASHAoWQ01EX1VEUF9Ub1NlcnZl", + "cl9IRUxMTxCgnAFCAkgBYgZwcm90bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.UDPCommandID), }, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO), global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO_RESP), global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO_RESP.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDP_P2P_HELLO), global::AxibugProtobuf.Protobuf_UDP_P2P_HELLO.Parser, new[]{ "UID" }, null, null, null, null) + })); + } + #endregion + + } + #region Enums + public enum UDPCommandID { + /// + ///缺省不使用 + /// + [pbr::OriginalName("CMD_UDP_DEFAUL")] CmdUdpDefaul = 0, + /// + ///和服务器UDP建立连接 下行 对应 Protobuf_MakeTunnel_RESP + /// + [pbr::OriginalName("CMD_UDP_ToServer_HELLO")] CmdUdpToServerHello = 20000, + } + + #endregion + + #region Messages + /// + ///ToServer Hello + /// + public sealed partial class Protobuf_UDP_TO_SERVER_HELLO : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDP_TO_SERVER_HELLO()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufUDPReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO(Protobuf_UDP_TO_SERVER_HELLO other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO Clone() { + return new Protobuf_UDP_TO_SERVER_HELLO(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDP_TO_SERVER_HELLO); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDP_TO_SERVER_HELLO other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDP_TO_SERVER_HELLO other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///ToServer Hello + /// + public sealed partial class Protobuf_UDP_TO_SERVER_HELLO_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDP_TO_SERVER_HELLO_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufUDPReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO_RESP(Protobuf_UDP_TO_SERVER_HELLO_RESP other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO_RESP Clone() { + return new Protobuf_UDP_TO_SERVER_HELLO_RESP(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDP_TO_SERVER_HELLO_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDP_TO_SERVER_HELLO_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDP_TO_SERVER_HELLO_RESP other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///P2PHello + /// + public sealed partial class Protobuf_UDP_P2P_HELLO : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDP_P2P_HELLO()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufUDPReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_P2P_HELLO() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_P2P_HELLO(Protobuf_UDP_P2P_HELLO other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_P2P_HELLO Clone() { + return new Protobuf_UDP_P2P_HELLO(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDP_P2P_HELLO); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDP_P2P_HELLO other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDP_P2P_HELLO other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/ProtobufCore/out/ProtobufAuth.cs b/ProtobufCore/out/ProtobufAuth.cs index 2ab2650..cfbdef9 100644 --- a/ProtobufCore/out/ProtobufAuth.cs +++ b/ProtobufCore/out/ProtobufAuth.cs @@ -33,15 +33,17 @@ namespace AxibugProtobuf { "dHVzGAQgASgOMiEuQXhpYnVnUHJvdG9idWYuTG9naW5SZXN1bHRTdGF0dXMi", "IwoQUHJvdG9idWZfQ2hhdE1zZxIPCgdDaGF0TXNnGAEgASgJIkgKFVByb3Rv", "YnVmX0NoYXRNc2dfUkVTUBIQCghOaWNrTmFtZRgBIAEoCRIPCgdDaGF0TXNn", - "GAIgASgJEgwKBERhdGUYAyABKAMqPQoJQ29tbWFuZElEEg4KCkNNRF9ERUZB", - "VUwQABIOCglDTURfTE9HSU4Q0Q8SEAoLQ01EX0NIQVRNU0cQoR8qKwoJRXJy", - "b3JDb2RlEhAKDEVSUk9SX0RFRkFVTBAAEgwKCEVSUk9SX09LEAEqPgoJTG9n", - "aW5UeXBlEg8KC0Jhc2VEZWZhdWx0EAASDgoKSGFvWXVlQXV0aBABEgcKA0JG", - "MxADEgcKA0JGNBAEKksKCkRldmljZVR5cGUSFgoSRGV2aWNlVHlwZV9EZWZh", - "dWx0EAASBgoCUEMQARILCgdBbmRyb2lkEAISBwoDSU9TEAMSBwoDUFNWEAQq", - "TgoRTG9naW5SZXN1bHRTdGF0dXMSIQodTG9naW5SZXN1bHRTdGF0dXNfQmFz", - "ZURlZmF1bHQQABIGCgJPSxABEg4KCkFjY291bnRFcnIQAkICSAFiBnByb3Rv", - "Mw==")); + "GAIgASgJEgwKBERhdGUYAyABKAMqnAEKCUNvbW1hbmRJRBIOCgpDTURfREVG", + "QVVMEAASDgoJQ01EX0xPR0lOENAPEhAKC0NNRF9DSEFUTVNHEKAfEhgKE0NN", + "RF9VU0VSX09OTElORUxJU1QQiCcSEgoNQ01EX1VTRVJfSk9JThCnJxITCg5D", + "TURfVVNFUl9MRUFWRRCoJxIaChVDTURfVVNFUl9TVEFURV9VUERBVEUQqScq", + "KwoJRXJyb3JDb2RlEhAKDEVSUk9SX0RFRkFVTBAAEgwKCEVSUk9SX09LEAEq", + "PgoJTG9naW5UeXBlEg8KC0Jhc2VEZWZhdWx0EAASDgoKSGFvWXVlQXV0aBAB", + "EgcKA0JGMxADEgcKA0JGNBAEKksKCkRldmljZVR5cGUSFgoSRGV2aWNlVHlw", + "ZV9EZWZhdWx0EAASBgoCUEMQARILCgdBbmRyb2lkEAISBwoDSU9TEAMSBwoD", + "UFNWEAQqTgoRTG9naW5SZXN1bHRTdGF0dXMSIQodTG9naW5SZXN1bHRTdGF0", + "dXNfQmFzZURlZmF1bHQQABIGCgJPSxABEg4KCkFjY291bnRFcnIQAkICSAFi", + "BnByb3RvMw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -61,13 +63,29 @@ namespace AxibugProtobuf { /// [pbr::OriginalName("CMD_DEFAUL")] CmdDefaul = 0, /// - ///登录上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP + ///登录 上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP /// - [pbr::OriginalName("CMD_LOGIN")] CmdLogin = 2001, + [pbr::OriginalName("CMD_LOGIN")] CmdLogin = 2000, /// - ///登录上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP + ///聊天 上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP /// - [pbr::OriginalName("CMD_CHATMSG")] CmdChatmsg = 4001, + [pbr::OriginalName("CMD_CHATMSG")] CmdChatmsg = 4000, + /// + ///获取在线用户列表 上行 | 下行 对应 Protobuf_UserList | Protobuf_UserList_RESP + /// + [pbr::OriginalName("CMD_USER_ONLINELIST")] CmdUserOnlinelist = 5000, + /// + ///用户上线 下行 对应 Protobuf_UserOnline_RESP + /// + [pbr::OriginalName("CMD_USER_JOIN")] CmdUserJoin = 5031, + /// + ///用户下线 下行 对应 Protobuf_UserOffline_RESP + /// + [pbr::OriginalName("CMD_USER_LEAVE")] CmdUserLeave = 5032, + /// + ///更新在线用户状态 下行 对应 Protobuf_UserState_RESP + /// + [pbr::OriginalName("CMD_USER_STATE_UPDATE")] CmdUserStateUpdate = 5033, } public enum ErrorCode { diff --git a/ProtobufCore/out/ProtobufTunnel.cs b/ProtobufCore/out/ProtobufTunnel.cs new file mode 100644 index 0000000..c131ca5 --- /dev/null +++ b/ProtobufCore/out/ProtobufTunnel.cs @@ -0,0 +1,1595 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_Tunnel.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_Tunnel.proto + public static partial class ProtobufTunnelReflection { + + #region Descriptor + /// File descriptor for protobuf_Tunnel.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufTunnelReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChVwcm90b2J1Zl9UdW5uZWwucHJvdG8SDkF4aWJ1Z1Byb3RvYnVmIhMKEVBy", + "b3RvYnVmX1VzZXJMaXN0IlsKFlByb3RvYnVmX1VzZXJMaXN0X1JFU1ASEQoJ", + "VXNlckNvdW50GAEgASgFEi4KCFVzZXJMaXN0GAIgAygLMhwuQXhpYnVnUHJv", + "dG9idWYuVXNlck1pbmlJbmZvIkgKFlByb3RvYnVmX1VzZXJKb2luX1JFU1AS", + "LgoIVXNlckluZm8YASABKAsyHC5BeGlidWdQcm90b2J1Zi5Vc2VyTWluaUlu", + "Zm8iJgoXUHJvdG9idWZfVXNlckxlYXZlX1JFU1ASCwoDVUlEGAEgASgDIjUK", + "F1Byb3RvYnVmX1VzZXJTdGF0ZV9SRVNQEgsKA1VJRBgBIAEoAxINCgVTdGF0", + "ZRgCIAEoBSI8CgxVc2VyTWluaUluZm8SCwoDVUlEGAEgASgDEhAKCE5pY2tO", + "YW1lGAIgASgJEg0KBVN0YXRlGAMgASgFIhkKF1Byb3RvYnVmX1VEUFNlcnZl", + "cl9JbmZvIkYKHFByb3RvYnVmX1VEUFNlcnZlcl9JbmZvX1JFU1ASEQoJVURQ", + "U2V2X0lQGAEgASgJEhMKC1VEUFNldl9Qb3J0GAIgASgFQgJIAWIGcHJvdG8z")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserList), global::AxibugProtobuf.Protobuf_UserList.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserList_RESP), global::AxibugProtobuf.Protobuf_UserList_RESP.Parser, new[]{ "UserCount", "UserList" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserJoin_RESP), global::AxibugProtobuf.Protobuf_UserJoin_RESP.Parser, new[]{ "UserInfo" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserLeave_RESP), global::AxibugProtobuf.Protobuf_UserLeave_RESP.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UserState_RESP), global::AxibugProtobuf.Protobuf_UserState_RESP.Parser, new[]{ "UID", "State" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.UserMiniInfo), global::AxibugProtobuf.UserMiniInfo.Parser, new[]{ "UID", "NickName", "State" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDPServer_Info), global::AxibugProtobuf.Protobuf_UDPServer_Info.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDPServer_Info_RESP), global::AxibugProtobuf.Protobuf_UDPServer_Info_RESP.Parser, new[]{ "UDPSevIP", "UDPSevPort" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///获取在线用户列表 上行 + /// + public sealed partial class Protobuf_UserList : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserList()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList(Protobuf_UserList other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList Clone() { + return new Protobuf_UserList(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserList); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserList other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserList other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + /// + ///获取在线用户列表 下行 + /// + public sealed partial class Protobuf_UserList_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserList_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList_RESP(Protobuf_UserList_RESP other) : this() { + userCount_ = other.userCount_; + userList_ = other.userList_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserList_RESP Clone() { + return new Protobuf_UserList_RESP(this); + } + + /// Field number for the "UserCount" field. + public const int UserCountFieldNumber = 1; + private int userCount_; + /// + ///玩家数量 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int UserCount { + get { return userCount_; } + set { + userCount_ = value; + } + } + + /// Field number for the "UserList" field. + public const int UserListFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_userList_codec + = pb::FieldCodec.ForMessage(18, global::AxibugProtobuf.UserMiniInfo.Parser); + private readonly pbc::RepeatedField userList_ = new pbc::RepeatedField(); + /// + ///用户列表 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pbc::RepeatedField UserList { + get { return userList_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserList_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserList_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UserCount != other.UserCount) return false; + if(!userList_.Equals(other.userList_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UserCount != 0) hash ^= UserCount.GetHashCode(); + hash ^= userList_.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UserCount != 0) { + output.WriteRawTag(8); + output.WriteInt32(UserCount); + } + userList_.WriteTo(output, _repeated_userList_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UserCount != 0) { + output.WriteRawTag(8); + output.WriteInt32(UserCount); + } + userList_.WriteTo(ref output, _repeated_userList_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UserCount != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(UserCount); + } + size += userList_.CalculateSize(_repeated_userList_codec); + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserList_RESP other) { + if (other == null) { + return; + } + if (other.UserCount != 0) { + UserCount = other.UserCount; + } + userList_.Add(other.userList_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UserCount = input.ReadInt32(); + break; + } + case 18: { + userList_.AddEntriesFrom(input, _repeated_userList_codec); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UserCount = input.ReadInt32(); + break; + } + case 18: { + userList_.AddEntriesFrom(ref input, _repeated_userList_codec); + break; + } + } + } + } + #endif + + } + + /// + ///用户上线 下行 + /// + public sealed partial class Protobuf_UserJoin_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserJoin_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserJoin_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserJoin_RESP(Protobuf_UserJoin_RESP other) : this() { + userInfo_ = other.userInfo_ != null ? other.userInfo_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserJoin_RESP Clone() { + return new Protobuf_UserJoin_RESP(this); + } + + /// Field number for the "UserInfo" field. + public const int UserInfoFieldNumber = 1; + private global::AxibugProtobuf.UserMiniInfo userInfo_; + /// + ///用户 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::AxibugProtobuf.UserMiniInfo UserInfo { + get { return userInfo_; } + set { + userInfo_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserJoin_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserJoin_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!object.Equals(UserInfo, other.UserInfo)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (userInfo_ != null) hash ^= UserInfo.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (userInfo_ != null) { + output.WriteRawTag(10); + output.WriteMessage(UserInfo); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (userInfo_ != null) { + output.WriteRawTag(10); + output.WriteMessage(UserInfo); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (userInfo_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(UserInfo); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserJoin_RESP other) { + if (other == null) { + return; + } + if (other.userInfo_ != null) { + if (userInfo_ == null) { + UserInfo = new global::AxibugProtobuf.UserMiniInfo(); + } + UserInfo.MergeFrom(other.UserInfo); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (userInfo_ == null) { + UserInfo = new global::AxibugProtobuf.UserMiniInfo(); + } + input.ReadMessage(UserInfo); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + if (userInfo_ == null) { + UserInfo = new global::AxibugProtobuf.UserMiniInfo(); + } + input.ReadMessage(UserInfo); + break; + } + } + } + } + #endif + + } + + /// + ///用户下线 下行 + /// + public sealed partial class Protobuf_UserLeave_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserLeave_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserLeave_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserLeave_RESP(Protobuf_UserLeave_RESP other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserLeave_RESP Clone() { + return new Protobuf_UserLeave_RESP(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserLeave_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserLeave_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserLeave_RESP other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///更新在线用户状态 下行 + /// + public sealed partial class Protobuf_UserState_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UserState_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserState_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserState_RESP(Protobuf_UserState_RESP other) : this() { + uID_ = other.uID_; + state_ = other.state_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UserState_RESP Clone() { + return new Protobuf_UserState_RESP(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + /// Field number for the "State" field. + public const int StateFieldNumber = 2; + private int state_; + /// + ///状态 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int State { + get { return state_; } + set { + state_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UserState_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UserState_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + if (State != other.State) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (State != 0) hash ^= State.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (State != 0) { + output.WriteRawTag(16); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (State != 0) { + output.WriteRawTag(16); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (State != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(State); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UserState_RESP other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + if (other.State != 0) { + State = other.State; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + State = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 16: { + State = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + public sealed partial class UserMiniInfo : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new UserMiniInfo()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public UserMiniInfo() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public UserMiniInfo(UserMiniInfo other) : this() { + uID_ = other.uID_; + nickName_ = other.nickName_; + state_ = other.state_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public UserMiniInfo Clone() { + return new UserMiniInfo(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + /// Field number for the "NickName" field. + public const int NickNameFieldNumber = 2; + private string nickName_ = ""; + /// + ///昵称 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string NickName { + get { return nickName_; } + set { + nickName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "State" field. + public const int StateFieldNumber = 3; + private int state_; + /// + ///状态 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int State { + get { return state_; } + set { + state_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as UserMiniInfo); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(UserMiniInfo other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + if (NickName != other.NickName) return false; + if (State != other.State) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (NickName.Length != 0) hash ^= NickName.GetHashCode(); + if (State != 0) hash ^= State.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (NickName.Length != 0) { + output.WriteRawTag(18); + output.WriteString(NickName); + } + if (State != 0) { + output.WriteRawTag(24); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (NickName.Length != 0) { + output.WriteRawTag(18); + output.WriteString(NickName); + } + if (State != 0) { + output.WriteRawTag(24); + output.WriteInt32(State); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (NickName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(NickName); + } + if (State != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(State); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(UserMiniInfo other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + if (other.NickName.Length != 0) { + NickName = other.NickName; + } + if (other.State != 0) { + State = other.State; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 18: { + NickName = input.ReadString(); + break; + } + case 24: { + State = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + case 18: { + NickName = input.ReadString(); + break; + } + case 24: { + State = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + /// + ///UDP服务器信息 上行 + /// + public sealed partial class Protobuf_UDPServer_Info : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDPServer_Info()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[6]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info(Protobuf_UDPServer_Info other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info Clone() { + return new Protobuf_UDPServer_Info(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDPServer_Info); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDPServer_Info other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDPServer_Info other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + /// + ///UDP服务器信息 下行 + /// + public sealed partial class Protobuf_UDPServer_Info_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDPServer_Info_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufTunnelReflection.Descriptor.MessageTypes[7]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info_RESP(Protobuf_UDPServer_Info_RESP other) : this() { + uDPSevIP_ = other.uDPSevIP_; + uDPSevPort_ = other.uDPSevPort_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDPServer_Info_RESP Clone() { + return new Protobuf_UDPServer_Info_RESP(this); + } + + /// Field number for the "UDPSev_IP" field. + public const int UDPSevIPFieldNumber = 1; + private string uDPSevIP_ = ""; + /// + ///UDP服务器IP + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string UDPSevIP { + get { return uDPSevIP_; } + set { + uDPSevIP_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "UDPSev_Port" field. + public const int UDPSevPortFieldNumber = 2; + private int uDPSevPort_; + /// + ///UDP服务器端口 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int UDPSevPort { + get { return uDPSevPort_; } + set { + uDPSevPort_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDPServer_Info_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDPServer_Info_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UDPSevIP != other.UDPSevIP) return false; + if (UDPSevPort != other.UDPSevPort) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UDPSevIP.Length != 0) hash ^= UDPSevIP.GetHashCode(); + if (UDPSevPort != 0) hash ^= UDPSevPort.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UDPSevIP.Length != 0) { + output.WriteRawTag(10); + output.WriteString(UDPSevIP); + } + if (UDPSevPort != 0) { + output.WriteRawTag(16); + output.WriteInt32(UDPSevPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UDPSevIP.Length != 0) { + output.WriteRawTag(10); + output.WriteString(UDPSevIP); + } + if (UDPSevPort != 0) { + output.WriteRawTag(16); + output.WriteInt32(UDPSevPort); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UDPSevIP.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(UDPSevIP); + } + if (UDPSevPort != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(UDPSevPort); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDPServer_Info_RESP other) { + if (other == null) { + return; + } + if (other.UDPSevIP.Length != 0) { + UDPSevIP = other.UDPSevIP; + } + if (other.UDPSevPort != 0) { + UDPSevPort = other.UDPSevPort; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + UDPSevIP = input.ReadString(); + break; + } + case 16: { + UDPSevPort = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + UDPSevIP = input.ReadString(); + break; + } + case 16: { + UDPSevPort = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/ProtobufCore/out/ProtobufUDP.cs b/ProtobufCore/out/ProtobufUDP.cs new file mode 100644 index 0000000..379c01b --- /dev/null +++ b/ProtobufCore/out/ProtobufUDP.cs @@ -0,0 +1,597 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: protobuf_UDP.proto +// +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace AxibugProtobuf { + + /// Holder for reflection information generated from protobuf_UDP.proto + public static partial class ProtobufUDPReflection { + + #region Descriptor + /// File descriptor for protobuf_UDP.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProtobufUDPReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChJwcm90b2J1Zl9VRFAucHJvdG8SDkF4aWJ1Z1Byb3RvYnVmIisKHFByb3Rv", + "YnVmX1VEUF9UT19TRVJWRVJfSEVMTE8SCwoDVUlEGAEgASgDIjAKIVByb3Rv", + "YnVmX1VEUF9UT19TRVJWRVJfSEVMTE9fUkVTUBILCgNVSUQYASABKAMiJQoW", + "UHJvdG9idWZfVURQX1AyUF9IRUxMTxILCgNVSUQYASABKAMqQAoMVURQQ29t", + "bWFuZElEEhIKDkNNRF9VRFBfREVGQVVMEAASHAoWQ01EX1VEUF9Ub1NlcnZl", + "cl9IRUxMTxCgnAFCAkgBYgZwcm90bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.UDPCommandID), }, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO), global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO_RESP), global::AxibugProtobuf.Protobuf_UDP_TO_SERVER_HELLO_RESP.Parser, new[]{ "UID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_UDP_P2P_HELLO), global::AxibugProtobuf.Protobuf_UDP_P2P_HELLO.Parser, new[]{ "UID" }, null, null, null, null) + })); + } + #endregion + + } + #region Enums + public enum UDPCommandID { + /// + ///缺省不使用 + /// + [pbr::OriginalName("CMD_UDP_DEFAUL")] CmdUdpDefaul = 0, + /// + ///和服务器UDP建立连接 下行 对应 Protobuf_MakeTunnel_RESP + /// + [pbr::OriginalName("CMD_UDP_ToServer_HELLO")] CmdUdpToServerHello = 20000, + } + + #endregion + + #region Messages + /// + ///ToServer Hello + /// + public sealed partial class Protobuf_UDP_TO_SERVER_HELLO : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDP_TO_SERVER_HELLO()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufUDPReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO(Protobuf_UDP_TO_SERVER_HELLO other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO Clone() { + return new Protobuf_UDP_TO_SERVER_HELLO(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDP_TO_SERVER_HELLO); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDP_TO_SERVER_HELLO other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDP_TO_SERVER_HELLO other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///ToServer Hello + /// + public sealed partial class Protobuf_UDP_TO_SERVER_HELLO_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDP_TO_SERVER_HELLO_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufUDPReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO_RESP(Protobuf_UDP_TO_SERVER_HELLO_RESP other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_TO_SERVER_HELLO_RESP Clone() { + return new Protobuf_UDP_TO_SERVER_HELLO_RESP(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDP_TO_SERVER_HELLO_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDP_TO_SERVER_HELLO_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDP_TO_SERVER_HELLO_RESP other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + /// + ///P2PHello + /// + public sealed partial class Protobuf_UDP_P2P_HELLO : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_UDP_P2P_HELLO()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufUDPReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_P2P_HELLO() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_P2P_HELLO(Protobuf_UDP_P2P_HELLO other) : this() { + uID_ = other.uID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_UDP_P2P_HELLO Clone() { + return new Protobuf_UDP_P2P_HELLO(this); + } + + /// Field number for the "UID" field. + public const int UIDFieldNumber = 1; + private long uID_; + /// + ///用户ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long UID { + get { return uID_; } + set { + uID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_UDP_P2P_HELLO); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_UDP_P2P_HELLO other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (UID != other.UID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (UID != 0L) hash ^= UID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (UID != 0L) { + output.WriteRawTag(8); + output.WriteInt64(UID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (UID != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_UDP_P2P_HELLO other) { + if (other == null) { + return; + } + if (other.UID != 0L) { + UID = other.UID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + UID = input.ReadInt64(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/ProtobufCore/proto/protobuf_Auth.proto b/ProtobufCore/proto/protobuf_Auth.proto index 5298c59..8eb9727 100644 --- a/ProtobufCore/proto/protobuf_Auth.proto +++ b/ProtobufCore/proto/protobuf_Auth.proto @@ -6,9 +6,18 @@ enum CommandID { CMD_DEFAUL = 0;//缺省不使用 - CMD_LOGIN = 2001; //登录上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP + CMD_LOGIN = 2000; //登录 上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP - CMD_CHATMSG = 4001; //登录上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP + CMD_CHATMSG = 4000; //聊天 上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP + + CMD_USER_ONLINELIST = 5000; //获取在线用户列表 上行 | 下行 对应 Protobuf_UserList | Protobuf_UserList_RESP + CMD_USER_JOIN = 5031; //用户上线 下行 对应 Protobuf_UserOnline_RESP + CMD_USER_LEAVE = 5032; //用户下线 下行 对应 Protobuf_UserOffline_RESP + CMD_USER_STATE_UPDATE = 5033; //更新在线用户状态 下行 对应 Protobuf_UserState_RESP + + //CMD_TUNNEL_UDPSERVER_INFO = 6000; //UDP服务器信息 上行 | 下行 对应 Protobuf_UDPServer_Info | Protobuf_UDPServer_Info_RESP + //CMD_TUNNEL_2Server_OK = 6001; //和服务器UDP建立连接 下行 对应 Protobuf_MakeTunnel_RESP + //CMD_TUNNEL_MAKE = 6002; //请求打洞 上行 | 下行 对应 Protobuf_MakeTunnel | Protobuf_MakeTunnel_RESP } enum ErrorCode diff --git a/ProtobufCore/proto/protobuf_Tunnel.proto b/ProtobufCore/proto/protobuf_Tunnel.proto new file mode 100644 index 0000000..cbe4d97 --- /dev/null +++ b/ProtobufCore/proto/protobuf_Tunnel.proto @@ -0,0 +1,56 @@ +syntax = "proto3"; +package AxibugProtobuf; +option optimize_for = SPEED; + + +//获取在线用户列表 上行 +message Protobuf_UserList +{ +} + +//获取在线用户列表 下行 +message Protobuf_UserList_RESP +{ + int32 UserCount = 1;//玩家数量 + repeated UserMiniInfo UserList = 2;//用户列表 +} + +//用户上线 下行 +message Protobuf_UserJoin_RESP +{ + UserMiniInfo UserInfo = 1;//用户 +} + +//用户下线 下行 +message Protobuf_UserLeave_RESP +{ + int64 UID = 1;//用户ID +} + +//更新在线用户状态 下行 +message Protobuf_UserState_RESP +{ + int64 UID = 1;//用户ID + int32 State = 2;//状态 +} + +message UserMiniInfo +{ + int64 UID = 1;//用户ID + string NickName = 2;//昵称 + int32 State = 3;//状态 +} + +//////////////////// + +//UDP服务器信息 上行 +message Protobuf_UDPServer_Info +{ +} + +//UDP服务器信息 下行 +message Protobuf_UDPServer_Info_RESP +{ + string UDPSev_IP = 1;//UDP服务器IP + int32 UDPSev_Port = 2;//UDP服务器端口 +} \ No newline at end of file diff --git a/ProtobufCore/proto/protobuf_UDP.proto b/ProtobufCore/proto/protobuf_UDP.proto new file mode 100644 index 0000000..b8dce9a --- /dev/null +++ b/ProtobufCore/proto/protobuf_UDP.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; +package AxibugProtobuf; +option optimize_for = SPEED; + +enum UDPCommandID +{ + CMD_UDP_DEFAUL = 0;//缺省不使用 + CMD_UDP_ToServer_HELLO = 20000; //和服务器UDP建立连接 下行 对应 Protobuf_MakeTunnel_RESP +} + +//ToServer Hello +message Protobuf_UDP_TO_SERVER_HELLO +{ + int64 UID = 1;//用户ID +} + +//ToServer Hello +message Protobuf_UDP_TO_SERVER_HELLO_RESP +{ + int64 UID = 1;//用户ID +} + +//P2PHello +message Protobuf_UDP_P2P_HELLO +{ + int64 UID = 1;//用户ID +} \ No newline at end of file diff --git a/Server/Program.cs b/Server/Program.cs index ee74c9a..04c49ad 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -1,4 +1,4 @@ -using ServerCore; +using ServerCore.Manager; ServerManager.InitServer(23846); @@ -10,7 +10,7 @@ while (true) switch (Command) { case "list": - Console.WriteLine("当前在线:" + ServerManager.g_ClientMgr.GetOnlineClient()); + Console.WriteLine("当前在线:" + ServerManager.g_ClientMgr.GetOnlineClientCount()); break; default: Console.WriteLine("未知命令" + CommandStr); diff --git a/ClientCore/Network/NetBase.cs b/ServerCore/Common/ProtoBufHelper.cs similarity index 85% rename from ClientCore/Network/NetBase.cs rename to ServerCore/Common/ProtoBufHelper.cs index c0b8217..04e9c46 100644 --- a/ClientCore/Network/NetBase.cs +++ b/ServerCore/Common/ProtoBufHelper.cs @@ -1,9 +1,10 @@ using Google.Protobuf; -namespace ClientCore +namespace ServerCore.Common { - public static class NetBase + public static class ProtoBufHelper { + public static byte[] Serizlize(IMessage msg) { return msg.ToByteArray(); diff --git a/ServerCore/Event/EEvent.cs b/ServerCore/Event/EEvent.cs new file mode 100644 index 0000000..a2d126e --- /dev/null +++ b/ServerCore/Event/EEvent.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ServerCore.Event +{ + public enum EEvent + { + // 添加你自己需要的事件类型 + OnUserJoin, + OnUserLeave + } +} diff --git a/ServerCore/Event/EventSystem.cs b/ServerCore/Event/EventSystem.cs new file mode 100644 index 0000000..a011153 --- /dev/null +++ b/ServerCore/Event/EventSystem.cs @@ -0,0 +1,222 @@ +using ServerCore.Manager; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ServerCore.Event +{ + + public class EventSystem + { + private static EventSystem instance = new EventSystem(); + public static EventSystem Instance { get { return instance; } } + + private Dictionary> eventDic = new Dictionary>(128); + + private EventSystem() { } + + + #region RegisterEvent + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + public void RegisterEvent(EEvent evt, Action callback) + { + InterRegisterEvent(evt, callback); + } + + private void InterRegisterEvent(EEvent evt, Delegate callback) + { + if (eventDic.ContainsKey(evt)) + { + if (eventDic[evt].IndexOf(callback) < 0) + { + eventDic[evt].Add(callback); + } + } + else + { + eventDic.Add(evt, new List() { callback }); + } + } + #endregion + + #region UnregisterEvent + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + public void UnregisterEvent(EEvent evt, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterEvent(evt, tempDelegate); + } + + private void InterUnregisterEvent(EEvent evt, Delegate callback) + { + if (eventDic.ContainsKey(evt)) + { + eventDic[evt].Remove(callback); + if (eventDic[evt].Count == 0) eventDic.Remove(evt); + } + } + #endregion + + #region PostEvent + public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3, T4 arg4) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2, arg3, arg4); + } + catch (Exception e) + { + ServerManager.g_Log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2, arg3); + } + catch (Exception e) + { + ServerManager.g_Log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T1 arg1, T2 arg2) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2); + } + catch (Exception e) + { + ServerManager.g_Log.Error(e.Message); + } + } + } + } + + public void PostEvent(EEvent evt, T arg) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg); + } + catch (Exception e) + { + ServerManager.g_Log.Error(e.Message + ", method name : " + callback.Method); + } + } + } + + } + + public void PostEvent(EEvent evt) + { + List eventList = GetEventList(evt); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(); + } + catch (Exception e) + { + ServerManager.g_Log.Error(e.Message); + } + } + } + } + #endregion + + /// + /// 获取所有事件 + /// + /// + /// + private List GetEventList(EEvent evt) + { + if (eventDic.ContainsKey(evt)) + { + List tempList = eventDic[evt]; + if (null != tempList) + { + return tempList; + } + } + return null; + } + } +} diff --git a/ServerCore/Manager/ChatManager.cs b/ServerCore/Manager/ChatManager.cs index 762834d..18bacbd 100644 --- a/ServerCore/Manager/ChatManager.cs +++ b/ServerCore/Manager/ChatManager.cs @@ -1,20 +1,26 @@ using AxibugProtobuf; using ServerCore.Common; +using ServerCore.NetWork; using System.Net.Sockets; -namespace ServerCore +namespace ServerCore.Manager { public class ChatManager { + public ChatManager() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdChatmsg, RecvPlayerChatMsg); + } + public void RecvPlayerChatMsg(Socket sk, byte[] reqData) { ClientInfo _c = ServerManager.g_ClientMgr.GetClientForSocket(sk); ServerManager.g_Log.Debug("收到新的登录请求"); - Protobuf_ChatMsg msg = NetBase.DeSerizlize(reqData); - byte[] respData = NetBase.Serizlize(new Protobuf_ChatMsg_RESP() + Protobuf_ChatMsg msg = ProtoBufHelper.DeSerizlize(reqData); + byte[] respData = ProtoBufHelper.Serizlize(new Protobuf_ChatMsg_RESP() { ChatMsg = msg.ChatMsg, - NickName = _c.Account, + NickName = _c.NickName, Date = Helper.GetNowTimeStamp() }); ServerManager.g_ClientMgr.ClientSendALL((int)CommandID.CmdChatmsg, (int)ErrorCode.ErrorOk, respData); diff --git a/ServerCore/Manager/ClientManager.cs b/ServerCore/Manager/ClientManager.cs index 7a6f31c..eeaf3a1 100644 --- a/ServerCore/Manager/ClientManager.cs +++ b/ServerCore/Manager/ClientManager.cs @@ -1,27 +1,36 @@ using AxibugProtobuf; +using ServerCore.Event; using System.Net.Sockets; using System.Timers; -namespace ServerCore +namespace ServerCore.Manager { public class ClientInfo { public long UID { get; set; } - public string Account { get; set; } + public string NickName { get; set; } public Socket _socket { get; set; } public bool IsOffline { get; set; } = false; public DateTime LogOutDT { get; set; } + public int State { get; set; } = 0; } public class ClientManager { private List ClientList = new List(); private Dictionary _DictSocketClient = new Dictionary(); - private Dictionary _DictUIDClient = new Dictionary(); + private Dictionary _DictUIDClient = new Dictionary(); private long TestUIDSeed = 0; private System.Timers.Timer _ClientCheckTimer; private long _RemoveOfflineCacheMin; + + + #region 事件 + + + #endregion + public void Init(long ticktime, long RemoveOfflineCacheMin) { //换算成毫秒 @@ -38,7 +47,7 @@ namespace ServerCore return ++TestUIDSeed; } - private void ClientCheckClearOffline_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + private void ClientCheckClearOffline_Elapsed(object sender, ElapsedEventArgs e) { DateTime CheckDT = DateTime.Now.AddMinutes(-1 * _RemoveOfflineCacheMin); ClientInfo[] OfflineClientlist = ClientList.Where(w => w.IsOffline == true && w.LogOutDT < CheckDT).ToArray(); @@ -72,11 +81,12 @@ namespace ServerCore { UID = GetNextUID(), _socket = _socket, - Account = data.Account, + NickName = data.Account, IsOffline = false, }; AddClient(cinfo); } + EventSystem.Instance.PostEvent(EEvent.OnUserJoin, cinfo.UID); return cinfo; } @@ -88,7 +98,7 @@ namespace ServerCore { try { - Console.WriteLine("追加连接玩家 UID=>" + clientInfo.UID + " | " + clientInfo.Account); + Console.WriteLine("追加连接玩家 UID=>" + clientInfo.UID + " | " + clientInfo.NickName); lock (ClientList) { _DictUIDClient.Add(clientInfo.UID, clientInfo); @@ -120,6 +130,10 @@ namespace ServerCore } } + public ClientInfo GetClientForUID(long UID) + { + return _DictUIDClient.ContainsKey(UID) ? _DictUIDClient[UID] : null; + } public ClientInfo GetClientForSocket(Socket sk) { @@ -130,9 +144,9 @@ namespace ServerCore /// 获取在线玩家 /// /// - public List GetOnlineClientList() + public ClientInfo[] GetOnlineClientList() { - return ClientList.Where(w => w.IsOffline == false).ToList(); + return ClientList.Where(w => w.IsOffline == false).ToArray(); } @@ -148,6 +162,7 @@ namespace ServerCore Console.WriteLine("标记玩家UID" + _DictSocketClient[sk].UID + "为离线"); _DictSocketClient[sk].IsOffline = true; _DictSocketClient[sk].LogOutDT = DateTime.Now; + EventSystem.Instance.PostEvent(EEvent.OnUserLeave, _DictSocketClient[sk].UID); } public void RemoveClientForSocket(Socket sk) @@ -162,7 +177,7 @@ namespace ServerCore public void ClientSendALL(int CMDID, int ERRCODE, byte[] data) { - ClientSend(ClientList,CMDID, ERRCODE, data); + ClientSend(ClientList, CMDID, ERRCODE, data); } /// @@ -174,11 +189,11 @@ namespace ServerCore /// public void ClientSend(List _toclientlist, int CMDID, int ERRCODE, byte[] data) { - for (int i = 0; i < _toclientlist.Count();i++) + for (int i = 0; i < _toclientlist.Count(); i++) { if (_toclientlist[i] == null || _toclientlist[i].IsOffline) continue; - ServerManager.g_SocketMgr.SendToSocket(_toclientlist[i]._socket, CMDID,ERRCODE,data); + ServerManager.g_SocketMgr.SendToSocket(_toclientlist[i]._socket, CMDID, ERRCODE, data); } } @@ -202,7 +217,7 @@ namespace ServerCore ServerManager.g_SocketMgr.SendToSocket(_c._socket, CMDID, ERRCODE, data); } - public int GetOnlineClient() + public int GetOnlineClientCount() { return ClientList.Where(w => !w.IsOffline).Count(); } diff --git a/ServerCore/Manager/LogManager.cs b/ServerCore/Manager/LogManager.cs index a431a49..b1d8e77 100644 --- a/ServerCore/Manager/LogManager.cs +++ b/ServerCore/Manager/LogManager.cs @@ -1,4 +1,4 @@ -namespace ServerCore +namespace ServerCore.Manager { public class LogManager { diff --git a/ServerCore/Manager/LoginManager.cs b/ServerCore/Manager/LoginManager.cs index 2f5db16..05d39b8 100644 --- a/ServerCore/Manager/LoginManager.cs +++ b/ServerCore/Manager/LoginManager.cs @@ -1,17 +1,24 @@ using AxibugProtobuf; +using ServerCore.Common; +using ServerCore.NetWork; using System.Net.Sockets; -namespace ServerCore +namespace ServerCore.Manager { public class LoginManager { - public void UserLogin(Socket _socket,byte[] reqData) + public LoginManager() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdLogin, UserLogin); + } + + public void UserLogin(Socket _socket, byte[] reqData) { ServerManager.g_Log.Debug("收到新的登录请求"); - Protobuf_Login msg = NetBase.DeSerizlize(reqData); - ClientInfo cinfo = ServerManager.g_ClientMgr.JoinNewClient(msg,_socket); + Protobuf_Login msg = ProtoBufHelper.DeSerizlize(reqData); + ClientInfo cinfo = ServerManager.g_ClientMgr.JoinNewClient(msg, _socket); - byte[] respData = NetBase.Serizlize(new Protobuf_Login_RESP() + byte[] respData = ProtoBufHelper.Serizlize(new Protobuf_Login_RESP() { Status = LoginResultStatus.Ok, RegDate = "", @@ -19,7 +26,7 @@ namespace ServerCore Token = "" }); - ServerManager.g_ClientMgr.ClientSend(cinfo,(int)CommandID.CmdLogin,(int)ErrorCode.ErrorOk,respData); + ServerManager.g_ClientMgr.ClientSend(cinfo, (int)CommandID.CmdLogin, (int)ErrorCode.ErrorOk, respData); } } } \ No newline at end of file diff --git a/ServerCore/Manager/P2PUserManager.cs b/ServerCore/Manager/P2PUserManager.cs new file mode 100644 index 0000000..8152373 --- /dev/null +++ b/ServerCore/Manager/P2PUserManager.cs @@ -0,0 +1,88 @@ +using AxibugProtobuf; +using Google.Protobuf; +using ServerCore.Common; +using ServerCore.Event; +using ServerCore.NetWork; +using System.Diagnostics; +using System.Net.Sockets; +using System.Timers; + +namespace ServerCore.Manager +{ + public class P2PUserManager + { + public P2PUserManager() + { + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdUserOnlinelist, RecvGetUserList); + + //事件 + EventSystem.Instance.RegisterEvent(EEvent.OnUserJoin, OnUserJoin); + EventSystem.Instance.RegisterEvent(EEvent.OnUserLeave, OnUserLeave); + } + + + #region + void OnUserJoin(long UID) + { + ServerManager.g_Log.Debug($"P2PUserManager->OnUserJoin UID->{UID}"); + SendUserJoin(UID); + } + void OnUserLeave(long UID) + { + ServerManager.g_Log.Debug($"P2PUserManager->OnUserLeave UID->{UID}"); + SendUserLeave(UID); + } + #endregion + + public void RecvGetUserList(Socket _socket, byte[] reqData) + { + Protobuf_UserList msg = ProtoBufHelper.DeSerizlize(reqData); + + ClientInfo _c = ServerManager.g_ClientMgr.GetClientForSocket(_socket); + Protobuf_UserList_RESP respData = new Protobuf_UserList_RESP(); + + ClientInfo[] cArr = ServerManager.g_ClientMgr.GetOnlineClientList(); + respData.UserCount = cArr.Length; + for (int i = 0; i < cArr.Length; i++) + { + ClientInfo client = cArr[i]; + respData.UserList.Add(new UserMiniInfo() + { + State = client.State, + NickName = client.NickName, + UID = client.UID, + }); + } + ServerManager.g_Log.Debug($"拉取用户列表->{respData.UserCount}个用户"); + ServerManager.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdUserOnlinelist, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(respData)); + } + + + public void SendUserJoin(long UID) + { + ClientInfo _c = ServerManager.g_ClientMgr.GetClientForUID(UID); + if (_c == null) + return; + + Protobuf_UserJoin_RESP resp = new Protobuf_UserJoin_RESP() + { + UserInfo = new UserMiniInfo() + { + State = _c.State, + NickName = _c.NickName, + UID = _c.UID, + } + }; + ServerManager.g_ClientMgr.ClientSendALL((int)CommandID.CmdUserJoin, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); + } + + public void SendUserLeave(long UID) + { + Protobuf_UserLeave_RESP resp = new Protobuf_UserLeave_RESP() + { + UID = UID, + }; + ServerManager.g_ClientMgr.ClientSendALL((int)CommandID.CmdUserLeave, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); + } + } +} diff --git a/ServerCore/Manager/ServerManager.cs b/ServerCore/Manager/ServerManager.cs index 7c4bd04..2ef557b 100644 --- a/ServerCore/Manager/ServerManager.cs +++ b/ServerCore/Manager/ServerManager.cs @@ -1,6 +1,8 @@ -using System.Net; +using ServerCore.Event; +using ServerCore.NetWork; +using System.Net; -namespace ServerCore +namespace ServerCore.Manager { public static class ServerManager { @@ -8,6 +10,7 @@ namespace ServerCore public static LogManager g_Log; public static LoginManager g_Login; public static ChatManager g_Chat; + public static P2PUserManager g_P2PMgr; public static IOCPNetWork g_SocketMgr; public static void InitServer(int port) @@ -16,6 +19,7 @@ namespace ServerCore g_Log = new LogManager(); g_Login = new LoginManager(); g_Chat = new ChatManager(); + g_P2PMgr = new P2PUserManager(); g_SocketMgr = new IOCPNetWork(1024, 1024); g_SocketMgr.Init(); g_SocketMgr.Start(new IPEndPoint(IPAddress.Any.Address, port)); diff --git a/ServerCore/NetWork/IOCPNetWork.cs b/ServerCore/NetWork/IOCPNetWork.cs index f60858a..ad84594 100644 --- a/ServerCore/NetWork/IOCPNetWork.cs +++ b/ServerCore/NetWork/IOCPNetWork.cs @@ -1,8 +1,9 @@ using AxibugProtobuf; using HaoYueNet.ServerNetwork; +using ServerCore.Manager; using System.Net.Sockets; -namespace ServerCore +namespace ServerCore.NetWork { public class IOCPNetWork : SocketManager { @@ -45,11 +46,8 @@ namespace ServerCore ServerManager.g_Log.Debug("收到消息 CMDID =>" + CMDID + " 数据长度=>" + data.Length); try { - switch ((CommandID)CMDID) - { - case CommandID.CmdLogin: ServerManager.g_Login.UserLogin(sk, data); break; - case CommandID.CmdChatmsg: ServerManager.g_Chat.RecvPlayerChatMsg(sk, data);break; - } + //抛出网络数据 + NetMsg.Instance.PostNetMsgEvent(CMDID, sk, data); } catch (Exception ex) { @@ -65,7 +63,7 @@ namespace ServerCore { OnCloseToOld(token.Socket); } - + /// /// 断开连接 /// @@ -75,6 +73,6 @@ namespace ServerCore Console.WriteLine("断开连接"); ServerManager.g_ClientMgr.SetClientOfflineForSocket(sk); } - + } } diff --git a/ServerCore/NetWork/NetMsg.cs b/ServerCore/NetWork/NetMsg.cs new file mode 100644 index 0000000..39acb0f --- /dev/null +++ b/ServerCore/NetWork/NetMsg.cs @@ -0,0 +1,103 @@ +using ServerCore.Manager; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace ServerCore.NetWork +{ + + public class NetMsg + { + private static NetMsg instance = new NetMsg(); + public static NetMsg Instance { get { return instance; } } + + private Dictionary> netEventDic = new Dictionary>(128); + + private NetMsg() { } + + + #region RegisterMsgEvent + + public void RegNetMsgEvent(int cmd, Action callback) + { + InterRegNetMsgEvent(cmd, callback); + } + + private void InterRegNetMsgEvent(int cmd, Delegate callback) + { + if (netEventDic.ContainsKey(cmd)) + { + if (netEventDic[cmd].IndexOf(callback) < 0) + { + netEventDic[cmd].Add(callback); + } + } + else + { + netEventDic.Add(cmd, new List() { callback }); + } + } + #endregion + + #region UnregisterCMD + + public void UnregisterCMD(int cmd, Action callback) + { + Delegate tempDelegate = callback; + InterUnregisterCMD(cmd, tempDelegate); + } + + private void InterUnregisterCMD(int cmd, Delegate callback) + { + if (netEventDic.ContainsKey(cmd)) + { + netEventDic[cmd].Remove(callback); + if (netEventDic[cmd].Count == 0) netEventDic.Remove(cmd); + } + } + #endregion + + #region PostEvent + public void PostNetMsgEvent(int cmd, Socket arg1, byte[] arg2) + { + List eventList = GetNetEventDicList(cmd); + if (eventList != null) + { + foreach (Delegate callback in eventList) + { + try + { + ((Action)callback)(arg1, arg2); + } + catch (Exception e) + { + ServerManager.g_Log.Error(e.Message); + } + } + } + } + #endregion + + /// + /// 获取所有事件 + /// + /// + /// + private List GetNetEventDicList(int cmd) + { + if (netEventDic.ContainsKey(cmd)) + { + List tempList = netEventDic[cmd]; + if (null != tempList) + { + return tempList; + } + } + return null; + } + } +}