网络库是NewLife系列最成功的作品,自2005年以来已经历过三代重构,最高取得2000万tps吞吐以及单机400万长连接的优秀成绩!
基于网络库的代表作包括:RPC框架ApiServer、HttpServer服务器、反向代理XProxy等。
Nuget包:NewLife.Core
源码地址:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Net/ISocketClient.cs
快速入门
打开vs2022,新建.NET6.0控制台项目,从nuget引入NewLife.Core,写入以下代码:
using NewLife; using NewLife.Log; using NewLife.Net; XTrace.UseConsole(); var uri = new NetUri("tcp://127.0.0.1:6000"); var client = uri.CreateRemote(); client.Timeout = 15_000; client.Log = XTrace.Log; client.Received += (s, e) => XTrace.WriteLine(e.Packet.ToStr()); client.Send("我是大石头!"); Console.ReadLine();
打开码神工具,下载地址 http://x.newlifex.com/XCoder_Install.exe 。使用网络调试工具,监听6000端口。
编译前面控制台项目,F5跑起来。可以在码神工具中看到控制台发送过来的数据。
码神工具下方发送窗口输入“谁是孙悟空?”,点击“发送”,控制台中收到了数据,并显示出来。
例程讲解
网络库有两个客户端,分别是TcpSession和UdpServe,代表Tcp和Udp的客户端封装,它们都实现了ISocketClient接口。
网络库统一使用NetUri表示地址定位,主要表达协议、主机和端口三者。如果不想用字符串,也可以用其它构造函数,直接指定三个内容。
NetUri的扩展方法CreateRemote直接根据协议创建客户端,上面例程是Tcp协议。更换为Udp也是可以的,因为码神工具那边是混合监听Tcp和Udp,功能一样。
var uri = new NetUri("udp://127.0.0.1:6000"); var client = uri.CreateRemote(); client.Timeout = 15_000; client.Log = XTrace.Log; client.LogSend = true; client.LogReceive = true;
Timeout设置超时时间,Log设置日志。
此外,还可以启用LogSend和LogReceive,把收发数据以十六进制形式打印出来。该方法方便开发调试,生产环境务必关闭。
客户端的接收默认是异步,事件驱动。
client.Received += (s, e) => XTrace.WriteLine(e.Packet.ToStr());
其中e.Packet即是收到的数据包,Packet类型,该类很像Span,设计于10年前,预计一两年后将会改用Span。具体使用细节可参考Span,这里不再重复。
数据发送很简单。
client.Send("我是大石头!");
直接发送Packet和Byte[]也是可以的。
此外,ISocketClient还支持Add<THandler>扩展注入链式处理器,用于自定义协议。细节可参考: