单机吞吐2266万tps的网络通信框架
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
2.9 KiB

using System;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Net;
using NewLife.Net.Handlers;
using NewLife.Threading;
namespace HandlerTest;
class Program
{
static void Main(String[] args)
{
XTrace.UseConsole();
try
{
Console.Write("请选择运行模式:1,服务端;2,客户端 ");
var ch = Console.ReadKey().KeyChar;
Console.WriteLine();
if (ch == '1')
TestServer();
else
TestClient();
}
catch (Exception ex)
{
XTrace.WriteException(ex);
}
Console.WriteLine("OK!");
Console.ReadKey();
}
static TimerX _timer;
static NetServer _server;
static PerfCounter _counter;
static void TestServer()
{
_counter = new PerfCounter();
// 实例化服务端,指定端口,同时在Tcp/Udp/IPv4/IPv6上监听
var svr = new NetServer
{
Port = 1234,
Log = XTrace.Log,
#if DEBUG
SocketLog = XTrace.Log,
LogSend = true,
LogReceive = true,
#endif
};
//svr.Add(new LengthFieldCodec { Size = 4 });
svr.Add<StandardCodec>();
//svr.Add<EchoHandler>();
svr.Add(new EchoHandler { Counter = _counter });
svr.Start();
_server = svr;
// 定时显示性能数据
_timer = new TimerX(ShowStat, svr, 100, 1000) { Async = true };
}
static void TestClient()
{
var uri = new NetUri("tcp://127.0.0.1:1234");
//var uri = new NetUri("tcp://net.newlifex.com:1234");
var client = uri.CreateRemote();
client.Log = XTrace.Log;
client.LogSend = true;
client.LogReceive = true;
client.Received += (s, e) =>
{
var pk = e.Message as IPacket;
XTrace.WriteLine("收到:{0}", pk.ToStr());
};
//client.Add(new LengthFieldCodec { Size = 4 });
client.Add<StandardCodec>();
client.Open();
// 定时显示性能数据
_timer = new TimerX(ShowStat, client, 100, 1000) { Async = true };
// 循环发送数据
for (var i = 0; i < 5; i++)
{
var str = "你好" + (i + 1);
//var pk = new Packet(str.GetBytes());
client.SendMessageAsync(str);
}
}
class User
{
public Int32 ID { get; set; }
public String Name { get; set; }
}
private static String _last;
static void ShowStat(Object state)
{
var msg = "";
if (state is NetServer ns)
msg = "处理:" + _counter + " " + ns.GetStat();
//else if (state is ISocketRemote ss)
// msg = ss.GetStat();
if (msg == _last) return;
_last = msg;
//Console.Title = msg;
XTrace.WriteLine(msg);
}
}