Browse Source

[fix] 修正例程错误,Packet全部改为使用IPacket。close: https://github.com/NewLifeX/NewLife.Net/issues/9#issuecomment-2728378297

master
智能大石头 4 months ago
parent
commit
8fd1e518f7
  1. 8
      Benchmark/Program.cs
  2. 7
      EchoTest/MyNetServer.cs
  3. 6
      HandlerTest/App.config
  4. 33
      HandlerTest/EchoHandler.cs
  5. 179
      HandlerTest/Program.cs
  6. 4
      HandlerTest/packages.config
  7. 48
      NewLife.Net/Application/EchoHandler.cs
  8. 49
      RpcTest/MyClient.cs
  9. 35
      RpcTest/MyController.cs
  10. 206
      RpcTest/Program.cs

8
Benchmark/Program.cs

@ -68,7 +68,7 @@ internal class Program
if (txt.IsNullOrEmpty()) txt = cfg.Content = "学无先后达者为师";
var buf = txt.StartsWith("0x") ? txt.TrimStart("0x").ToHex() : txt.GetBytes();
var pk = new Packet(buf);
var pk = new ArrayPacket(buf);
// 绑定集合
var binds = new List<(IPAddress, NetUri)>();
@ -104,7 +104,7 @@ internal class Program
Console.WriteLine("目标:{0}", uri);
Console.WriteLine("请求:{0:n0}", cfg.Times);
Console.WriteLine("并发:{0:n0}", cfg.ConcurrentLevel);
Console.WriteLine("内容:[{0:n0}] {1}", pk.Count, txt);
Console.WriteLine("内容:[{0:n0}] {1}", pk.Length, txt);
if (cfg.Interval > 0) Console.WriteLine("间隔:{0:n0}", cfg.Interval);
if (!cfg.Bind.IsNullOrEmpty())
@ -151,9 +151,9 @@ internal class Program
Console.WriteLine("速度:{0:n0}tps", total * 1000L / ms);
}
private static readonly ConcurrentHashSet<Type> _LastErrors = new ConcurrentHashSet<Type>();
private static readonly ConcurrentHashSet<Type> _LastErrors = new();
private static async Task<Int32> WorkOneAsync(IPEndPoint local, NetUri uri, Config cfg, Packet pk)
private static async Task<Int32> WorkOneAsync(IPEndPoint local, NetUri uri, Config cfg, IPacket pk)
{
var count = 0;
try

7
EchoTest/MyNetServer.cs

@ -1,5 +1,6 @@
using System;
using NewLife;
using NewLife.Data;
using NewLife.Net;
namespace EchoTest
@ -22,13 +23,13 @@ namespace EchoTest
}
/// <summary>客户端断开连接</summary>
protected override void OnDisconnected()
protected override void OnDisconnected(String reason)
{
#if DEBUG
WriteLog("客户端{0}已经断开连接啦", Remote);
WriteLog("客户端{0}已经断开连接啦,原因:{1}", Remote, reason);
#endif
base.OnDisconnected();
base.OnDisconnected(reason);
}
/// <summary>收到客户端数据</summary>

6
HandlerTest/App.config

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>

33
HandlerTest/EchoHandler.cs

@ -4,30 +4,29 @@ using NewLife.Log;
using NewLife.Model;
using NewLife.Net;
namespace HandlerTest
namespace HandlerTest;
class EchoHandler : Handler
{
class EchoHandler : Handler
{
/// <summary>性能计数器</summary>
public ICounter Counter { get; set; }
/// <summary>性能计数器</summary>
public ICounter Counter { get; set; }
public override Object Read(IHandlerContext context, Object message)
{
var ctx = context as NetHandlerContext;
var session = ctx.Session;
public override Object Read(IHandlerContext context, Object message)
{
var ctx = context as NetHandlerContext;
var session = ctx.Session;
// 性能计数
Counter?.Increment(1, 0);
// 性能计数
Counter?.Increment(1, 0);
var pk = message as Packet;
var pk = message as IPacket;
#if DEBUG
session.WriteLog("收到:{0}", pk.ToStr());
session.WriteLog("收到:{0}", pk.ToStr());
#endif
// 把收到的数据发回去
session.SendMessage(pk);
// 把收到的数据发回去
session.SendMessage(pk);
return null;
}
return null;
}
}

179
HandlerTest/Program.cs

@ -6,114 +6,113 @@ using NewLife.Net;
using NewLife.Net.Handlers;
using NewLife.Threading;
namespace HandlerTest
namespace HandlerTest;
class Program
{
class Program
static void Main(String[] args)
{
static void Main(String[] args)
XTrace.UseConsole();
try
{
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();
Console.Write("请选择运行模式:1,服务端;2,客户端 ");
var ch = Console.ReadKey().KeyChar;
Console.WriteLine();
if (ch == '1')
TestServer();
else
TestClient();
}
static TimerX _timer;
static NetServer _server;
static PerfCounter _counter;
static void TestServer()
catch (Exception ex)
{
_counter = new PerfCounter();
XTrace.WriteException(ex);
}
Console.WriteLine("OK!");
Console.ReadKey();
}
// 实例化服务端,指定端口,同时在Tcp/Udp/IPv4/IPv6上监听
var svr = new NetServer
{
Port = 1234,
Log = XTrace.Log,
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,
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.Add(new LengthFieldCodec { Size = 4 });
svr.Add<StandardCodec>();
//svr.Add<EchoHandler>();
svr.Add(new EchoHandler { Counter = _counter });
svr.Start();
svr.Start();
_server = svr;
_server = svr;
// 定时显示性能数据
_timer = new TimerX(ShowStat, svr, 100, 1000) { Async = true };
}
// 定时显示性能数据
_timer = new TimerX(ShowStat, svr, 100, 1000) { Async = true };
}
static void TestClient()
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 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 Packet;
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(pk);
}
}
var pk = e.Message as IPacket;
XTrace.WriteLine("收到:{0}", pk.ToStr());
};
//client.Add(new LengthFieldCodec { Size = 4 });
client.Add<StandardCodec>();
client.Open();
class User
// 定时显示性能数据
_timer = new TimerX(ShowStat, client, 100, 1000) { Async = true };
// 循环发送数据
for (var i = 0; i < 5; i++)
{
public Int32 ID { get; set; }
public String Name { get; set; }
var str = "你好" + (i + 1);
//var pk = new Packet(str.GetBytes());
client.SendMessageAsync(str);
}
}
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();
class User
{
public Int32 ID { get; set; }
public String Name { get; set; }
}
if (msg == _last) return;
_last = msg;
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();
//Console.Title = msg;
XTrace.WriteLine(msg);
}
if (msg == _last) return;
_last = msg;
//Console.Title = msg;
XTrace.WriteLine(msg);
}
}

4
HandlerTest/packages.config

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NewLife.Core" version="7.3.6755.22250" targetFramework="net461" />
</packages>

48
NewLife.Net/Application/EchoHandler.cs

@ -1,36 +1,34 @@
using System;
using NewLife.Data;
using NewLife.Data;
using NewLife.Log;
using NewLife.Model;
namespace NewLife.Net.Application
namespace NewLife.Net.Application;
/// <summary>回声处理器</summary>
public class EchoHandler : Handler
{
/// <summary>回声处理器</summary>
public class EchoHandler : Handler
/// <summary>读取</summary>
/// <param name="context"></param>
/// <param name="message"></param>
/// <returns></returns>
public override Object Read(IHandlerContext context, Object message)
{
/// <summary>读取</summary>
/// <param name="context"></param>
/// <param name="message"></param>
/// <returns></returns>
public override Object Read(IHandlerContext context, Object message)
{
var ctx = context as NetHandlerContext;
var session = ctx.Session;
var ctx = context as NetHandlerContext;
var session = ctx.Session;
if (message is Packet pk)
{
var len = pk.Total;
if (len > 100)
XTrace.WriteLine("Echo {0} [{1}]", session, len);
else
XTrace.WriteLine("Echo {0} [{1}] {2}", session, len, pk.ToStr());
}
if (message is IPacket pk)
{
var len = pk.Total;
if (len > 100)
XTrace.WriteLine("Echo {0} [{1}]", session, len);
else
XTrace.WriteLine("{0}", message);
XTrace.WriteLine("Echo {0} [{1}] {2}", session, len, pk.ToStr());
}
else
XTrace.WriteLine("{0}", message);
session.SendMessage(message);
session.SendMessage(message);
return null;
}
return null;
}
}

49
RpcTest/MyClient.cs

@ -1,37 +1,34 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using NewLife.Data;
using NewLife.Remoting;
namespace RpcTest
namespace RpcTest;
/// <summary>自定义业务客户端</summary>
class MyClient : ApiClient
{
/// <summary>自定义业务客户端</summary>
class MyClient : ApiClient
{
public MyClient(String uri) : base(uri) { }
public MyClient(String uri) : base(uri) { }
/// <summary>添加,标准业务服务,走Json序列化</summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public async Task<Int32> AddAsync(Int32 x, Int32 y)
{
return await InvokeAsync<Int32>("My/Add", new { x, y });
}
/// <summary>添加,标准业务服务,走Json序列化</summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public async Task<Int32> AddAsync(Int32 x, Int32 y)
{
return await InvokeAsync<Int32>("My/Add", new { x, y });
}
/// <summary>RC4加解密,高速业务服务,二进制收发不经序列化</summary>
/// <param name="pk"></param>
/// <returns></returns>
public async Task<Packet> RC4Async(Packet pk)
{
return await InvokeAsync<Packet>("My/RC4", pk);
}
/// <summary>RC4加解密,高速业务服务,二进制收发不经序列化</summary>
/// <param name="pk"></param>
/// <returns></returns>
public async Task<IPacket> RC4Async(IPacket pk)
{
return await InvokeAsync<IPacket>("My/RC4", pk);
}
public async Task<User> FindUserAsync(Int32 uid, Boolean enable)
{
return await InvokeAsync<User>("User/FindByID", new { uid, enable });
}
public async Task<User> FindUserAsync(Int32 uid, Boolean enable)
{
return await InvokeAsync<User>("User/FindByID", new { uid, enable });
}
}

35
RpcTest/MyController.cs

@ -2,26 +2,25 @@
using NewLife;
using NewLife.Data;
namespace RpcTest
namespace RpcTest;
/// <summary>自定义控制器。包含多个服务</summary>
class MyController
{
/// <summary>自定义控制器。包含多个服务</summary>
class MyController
{
/// <summary>添加,标准业务服务,走Json序列化</summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public Int32 Add(Int32 x, Int32 y) => x + y;
/// <summary>添加,标准业务服务,走Json序列化</summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public Int32 Add(Int32 x, Int32 y) => x + y;
/// <summary>RC4加解密,高速业务服务,二进制收发不经序列化</summary>
/// <param name="pk"></param>
/// <returns></returns>
public Packet RC4(Packet pk)
{
var data = pk.ToArray();
var pass = "NewLife".GetBytes();
/// <summary>RC4加解密,高速业务服务,二进制收发不经序列化</summary>
/// <param name="pk"></param>
/// <returns></returns>
public IPacket RC4(IPacket pk)
{
var data = pk.ToArray();
var pass = "NewLife".GetBytes();
return data.RC4(pass);
}
return (ArrayPacket)data.RC4(pass);
}
}

206
RpcTest/Program.cs

@ -3,123 +3,121 @@ using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Net;
using NewLife.Net.Handlers;
using NewLife.Remoting;
using NewLife.Threading;
namespace RpcTest
namespace RpcTest;
class Program
{
class Program
static void Main(String[] args)
{
static void Main(String[] args)
XTrace.UseConsole();
try
{
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();
Console.Write("请选择运行模式:1,服务端;2,客户端 ");
var ch = Console.ReadKey().KeyChar;
Console.WriteLine();
if (ch == '1')
TestServer();
else
TestClient();
}
static TimerX _timer;
static ApiServer _server;
static void TestServer()
catch (Exception ex)
{
// 实例化RPC服务端,指定端口,同时在Tcp/Udp/IPv4/IPv6上监听
var svr = new ApiServer(1234);
// 注册服务控制器
svr.Register<MyController>();
svr.Register<UserController>();
// 指定编码器
svr.Encoder = new JsonEncoder();
svr.EncoderLog = XTrace.Log;
// 打开原始数据日志
var ns = svr.EnsureCreate() as NetServer;
//var ns = svr.Server as NetServer;
ns.Log = XTrace.Log;
ns.LogSend = true;
ns.LogReceive = true;
svr.Log = XTrace.Log;
svr.Start();
_server = svr;
// 定时显示性能数据
_timer = new TimerX(ShowStat, ns, 100, 1000);
XTrace.WriteException(ex);
}
static async void TestClient()
Console.WriteLine("OK!");
Console.ReadKey();
}
static TimerX _timer;
static ApiServer _server;
static void TestServer()
{
// 实例化RPC服务端,指定端口,同时在Tcp/Udp/IPv4/IPv6上监听
var svr = new ApiServer(1234);
// 注册服务控制器
svr.Register<MyController>();
svr.Register<UserController>();
// 指定编码器
svr.Encoder = new JsonEncoder();
svr.EncoderLog = XTrace.Log;
// 打开原始数据日志
var ns = svr.EnsureCreate() as NetServer;
//var ns = svr.Server as NetServer;
ns.Log = XTrace.Log;
ns.LogSend = true;
ns.LogReceive = true;
svr.Log = XTrace.Log;
svr.Start();
_server = svr;
// 定时显示性能数据
_timer = new TimerX(ShowStat, ns, 100, 1000);
}
static async void TestClient()
{
var client = new MyClient("tcp://127.0.0.1:1234");
// 指定编码器
client.Encoder = new JsonEncoder();
client.EncoderLog = XTrace.Log;
//// 打开原始数据日志
//var ns = client.Client;
//ns.Log = XTrace.Log;
//ns.LogSend = true;
//ns.LogReceive = true;
// 定时显示性能数据
client.StatPeriod = 5;
client.Log = XTrace.Log;
client.Open();
// 定时显示性能数据
//_timer = new TimerX(ShowStat, ns, 100, 1000);
// 标准服务,Json
var n = await client.AddAsync(1245, 3456);
XTrace.WriteLine("Add: {0}", n);
// 高速服务,二进制
var buf = "Hello".GetBytes();
var pk = await client.RC4Async((ArrayPacket)buf);
XTrace.WriteLine("RC4: {0}", pk.ToHex());
// 返回对象
var user = await client.FindUserAsync(123, true);
XTrace.WriteLine("FindUser: ID={0} Name={1} Enable={2} CreateTime={3}", user.ID, user.Name, user.Enable, user.CreateTime);
// 拦截异常
try
{
var client = new MyClient("tcp://127.0.0.1:1234");
// 指定编码器
client.Encoder = new JsonEncoder();
client.EncoderLog = XTrace.Log;
//// 打开原始数据日志
//var ns = client.Client;
//ns.Log = XTrace.Log;
//ns.LogSend = true;
//ns.LogReceive = true;
// 定时显示性能数据
client.StatPeriod = 5;
client.Log = XTrace.Log;
client.Open();
// 定时显示性能数据
//_timer = new TimerX(ShowStat, ns, 100, 1000);
// 标准服务,Json
var n = await client.AddAsync(1245, 3456);
XTrace.WriteLine("Add: {0}", n);
// 高速服务,二进制
var buf = "Hello".GetBytes();
var pk = await client.RC4Async(buf);
XTrace.WriteLine("RC4: {0}", pk.ToHex());
// 返回对象
var user = await client.FindUserAsync(123, true);
XTrace.WriteLine("FindUser: ID={0} Name={1} Enable={2} CreateTime={3}", user.ID, user.Name, user.Enable, user.CreateTime);
// 拦截异常
try
{
user = await client.FindUserAsync(123, true);
}
catch (ApiException ex)
{
XTrace.WriteLine("FindUser出错,错误码={0},内容={1}", ex.Code, ex.Message);
}
user = await client.FindUserAsync(123, true);
}
static void ShowStat(Object state)
catch (ApiException ex)
{
var msg = "";
if (state is NetServer ns)
msg = ns.GetStat();
//else if (state is ISocketRemote ss)
// msg = ss.GetStat();
Console.Title = msg;
XTrace.WriteLine("FindUser出错,错误码={0},内容={1}", ex.Code, ex.Message);
}
}
static void ShowStat(Object state)
{
var msg = "";
if (state is NetServer ns)
msg = ns.GetStat();
//else if (state is ISocketRemote ss)
// msg = ss.GetStat();
Console.Title = msg;
}
}
Loading…
Cancel
Save