APM测试
俗话说麻雀虽小,五脏俱全。apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis、kafka等改造成大型分布式消息推送服务器)。
测试demo:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Text; 6 using System.Threading; 7 using System.Threading.Tasks; 8 9 namespace APM.ConsoleDemo 10 { 11 class Program 12 { 13 14 static void Main(string[] args) 15 { 16 Console. = "APM.Core test"; 17 18 Console.WriteLine("输入1测试APM tcp通讯"); 19 20 Console.WriteLine("输入2测试APM转发"); 21 22 var str = Console.ReadLine(); 23 24 if (!string.IsNullOrEmpty(str) && str != "1") 25 { 26 APMServer(); 27 APMClient(); 28 APMClient(); 29 } 30 else 31 { 32 Task.Factory.StartNew(() => 33 { 34 Thread.Sleep(2000); 35 ClientProcess(); 36 }); 37 ServerProcess(true); 38 } 39 Console.ReadLine(); 40 } 41 42 private static APM.Core.Server server; 43 static void ServerProcess(bool falg = false) 44 { 45 Console.WriteLine("server test"); 46 server = new APM.Core.Server(8889, 500); 47 server.OnAccepted += Server_OnAccepted; 48 server.OnMessage += Server_OnReceived; 49 server.OnDisConnected += Server_OnDisConnected; 50 server.On += Server_On ; 51 server.Start(); 52 Console.WriteLine("server is running..."); 53 if (falg) 54 { 55 while (true) 56 { 57 Console.ReadLine(); 58 Console.WriteLine(string.Format("serverinfo[ClientCount:{0},ReceiveCount:{1},SendCount:{2}]", server.ClientCount, server.ReceiveCount, server.SendCount)); 59 } 60 } 61 62 } 63 64 65 private static APM.Core.Client client; 66 static void ClientProcess() 67 { 68 69 Console.WriteLine("Client test"); 70 71 var localIP = GetLocalIp() + ":8889"; 72 73 Console.WriteLine("Client send test"); 74 client = new APM.Core.Client(Guid.NewGuid().ToString("N"), 10, localIP); 75 client.OnConnected += Client_OnConnected; 76 client.OnMessage += Client_OnMessage; 77 client.OnDisConnected += Client_OnDisConnected; 78 client. += Client_ ; 79 client.Connect(); 80 81 Console. = "APM Server & Client"; 82 Console.WriteLine("MutiClients test"); 83 for (int i = 0; i < 10000; i++) 84 { 85 new APM.Core.Client(Guid.NewGuid().ToString("N"), 10, localIP).Connect(); 86 } 87 88 } 89 90 #region server events 91 private static void Server_OnAccepted(APM.Core.UserToken remote) 92 { 93 Console.WriteLine("收到客户端连接:" + remote.Client.RemoteEndPoint); 94 95 } 96 private static void Server_OnReceived(APM.Core.UserToken remote, byte[] data) 97 { 98 if (server.ClientCount <= 10) 99 {100 Console.WriteLine("收到客户端消息:" + remote.Client.RemoteEndPoint + " " + Encoding.UTF8.GetString(data));101 }102 server.SendMsg(remote, "server:hello " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));103 }104 105 private static void Server_OnDisConnected(APM.Core.UserToken remote, Exception ex)106 {107 Console.WriteLine(string.Format("客户端{0}已断开连接,断开消息:{1}", remote.ID, ex.Message));108 }109 110 private static void Server_On (APM.Core.UserToken remote, Exception ex)111 {112 Console.WriteLine(string.Format("操作客户端{0}异常,断开消息:{1}", remote.ID, ex.Message));113 }114 115 116 #endregion117 118 #region client events119 120 static string msg = "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohelloh";121 private static void Client_OnConnected(APM.Core.Client c)122 {123 if (c != null)124 c.SendMsg(string.Format("client:{0} {1}", msg, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));125 126 }127 128 private static void Client_OnMessage(byte[] data)129 {130 Console.WriteLine("收到服务器信息:" + Encoding.UTF8.GetString(data));131 if (client != null)132 client.SendMsg(string.Format("client:{0} {1}", msg, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));133 }134 135 private static void Client_OnDisConnected(Exception ex)136 {137 Console.WriteLine(string.Format("客户端断开连接,断开消息:{0}", ex.Message));138 }139 140 private static void Client_ (Exception ex)141 {142 Console.WriteLine(string.Format("客户端异常,异常消息:{0}", ex.Message));143 }144 145 146 #endregion147 148 #region MyRegion149 static string GetLocalIp()150 {151 string hostname = Dns.GetHostName();//得到本机名 152 //IPHostEntry localhost = Dns.GetHostByName(hostname);//方法已过期,只得到IPv4的地址 153 IPHostEntry localhost = Dns.GetHostEntry(hostname);154 IPAddress localaddr = localhost.AddressList.Where(b => b.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).Last();155 return localaddr.ToString();156 }157 #endregion158 159 160 #region APM转发161 public static void APMServer()162 {163 Console.WriteLine("APMServer test");164 APM.Server.APMServer server = new Server.APMServer(8890, 1024);165 server.OnAccepted += Server_OnAccepted;166 server.OnDisConnected += Server_OnDisConnected;167 server. += Server_On ;168 server.OnMessage += Server_OnMessage;169 server.Start();170 Console.WriteLine("APMServer 已启动...");171 }172 173 private static void Server_OnMessage(Core.Extention.Message msg)174 {175 Console.WriteLine("APMServer 收到并转发消息:ID {0},Sender {1},SessionID {2},SendTick {3}", msg.ID, msg.Sender, msg.SessionID, msg.SendTick);176 }177 178 public static void APMClient()179 {180 Console.WriteLine("APMClient test");181 var userID = "张三" + new Random((int)DateTime.Now.Ticks).Next(10000, 99999);182 APM.Client.APMClient apmClient = new Client.APMClient(userID, GetLocalIp(), 8890);183 apmClient.OnConnected += ApmClient_OnConnected;184 apmClient.OnDisConnected += Client_OnDisConnected;185 apmClient. += Client_ ;186 apmClient.OnMessage += APMClient_OnMessage;187 apmClient.Connect();188 Task.Factory.StartNew(() =>189 {190 while (true)191 {192 if (apmClient.Connected)193 {194 apmClient.SendChannelMsg("all", string.Format("client:{0} {1}", msg, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));195 }196 Thread.Sleep(0);197 }198 });199 Console.WriteLine("APMClient:{0} 已连接到服务器", userID);200 }201 202 private static void ApmClient_OnConnected(Client.APMClient c)203 {204 c.Subscribe("all"); 205 }206 207 private static void APMClient_OnMessage(Core.Extention.Message msg)208 {209 Console.WriteLine("APMClient 收到消息:ID {0},Sender {1},SessionID {2},SendTick {3}", msg.ID, msg.Sender, msg.SessionID, msg.SendTick);210 }211 #endregion212 }213 }
github地址:https://github.com/yswenli/APM
异步tcp通信——APM.Core 服务端概述
异步tcp通信——APM.Core 解包
异步tcp通信——APM.Server 消息推送服务的实现
异步tcp通信——APM.ConsoleDemo
转载请标明本文来源:http://www.cnblogs.com/yswenli/
更多内容欢迎star作者的github:https://github.com/yswenli/APM
如果发现本文有什么问题和任何建议,也随时欢迎交流~
继续阅读与本文标签相同的文章
下一篇 :
C#如何使用ES
-
Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS 对比
2026-06-02栏目: 教程
-
DOTNET Core 命令
2026-06-02栏目: 教程
-
always on 集群
2026-06-02栏目: 教程
-
快速在Ubuntu安装PHP网站
2026-06-02栏目: 教程
-
.NET平台常用的框架整理
2026-06-02栏目: 教程

