ET服务器框架学习笔记(十一)
文章目录
前言
前篇主要记录了Channel,Service,Session通讯底层及中间层,本篇主要记录通讯上层NetworkComponent业务组件。
一、NetworkComponent功能
NetworkComponent组件主要功能:1.绑定一个Service,并且根据协议类型绑定不同的协议方式,2.管理与之相关的所有session,3.关联session,service与channel,4.对外提供创建session的能力,5.驱动Service,6.以及释放
需要注意的是,NetworkComponent是一个抽象类,具体的功能需要看各个继承于他的子类,ET中主要包含内网NetInnerComponent:主要用于服务器与内网各个服务模块之间的通信,NetOuterComponent服务器与外网进行通信
二、NetworkComponent详细
1.NetworkComponent的数据
- public AppType AppType:指明app类型,应该从继承的类中进行指明。
- protected AService Service;绑定的Service引用,一个NetworkComponent绑定一个Serviece,主要用于作为服务端监听服务。
- private readonly Dictionary<long, Session> sessions = new Dictionary<long, Session>():管理所有与NetworkComponent相关的session.
- public IMessagePacker MessagePacker { get; set; }:指明本组件所用的数据序列化类,ET中主要包含:protobufPacker(通过protobuf方式序列化与反序列化),MongoPacker(通过mongodb方式序列化与反序列化)
- public IMessageDispatcher MessageDispatcher { get; set; }:指明协议数据派发器类型,应该由继承类型指定,主要用于session获取到数据后的派发行为。
- int Count属性:获取session个数
1.NetworkComponent的主要功能方法
-Awake方法:目前有两个版本的Awake方法,一个带地址,一个不带地址,不带地址的应该没地方使用,这里就只记录下带地址的版本
public void Awake(NetworkProtocol protocol, string address, int packetSize = Packet.PacketSizeLength2)
{
try
{
IPEndPoint ipEndPoint;
switch (protocol)
{
case NetworkProtocol.KCP:
ipEndPoint = NetworkHelper.ToIPEndPoint(address);
this.Service = new KService(ipEndPoint, this.OnAccept) { Parent = this };
break;
case NetworkProtocol.TCP:
ipEndPoint = NetworkHelper.ToIPEndPoint(address);
this.Service = new TService(packetSize, ipEndPoint, this.OnAccept) { Parent = this };
break;
case NetworkProtocol.WebSocket:
string[] prefixs = address.Split(';');
this.Service = new WService(prefixs, this.OnAccept) { Parent = this };
break;
}
}
catch (Exception e)
{
throw new Exception($"NetworkComponent Awake Error {address}", e);
}
}
根据传入的NetworkProtocol类型信息,给NetworkComponent的service初始化不同的Service。每个service大致的逻辑差不多,只是底层使用的方式有所不同,这里就不一一记录了。
需要注意的地方:1.实例化一个service时,会将自己的OnAccept方法传入进去,当作Service的回调函数,当Service作为服务器使用时,会监听到与其连接的事件,从而回调到NetworkComponent的OnAccept方法,2.实例化service时,会将service的Parent设为自己,因为没有走工厂的创建模式,所以之类需要手动调用一下。
- OnAccept(AChannel channel):这个方法主要用于Service监听到有连接时回调到这里,Service在内部会创建一个Channel与之连接,传入创建的channel,然后创建一个Session与channel关联起来,并将这个Session放入到sessions中进行管理。同时调用Session的Start,进而启动channel的start,开始接收socekt数据。
public void OnAccept(AChannel channel)
{
Session session = ComponentFactory.CreateWithParent<Session, AChannel>(this, channel);
this.sessions.Add(session.Id, session);
session.Start();
}
-
Session Get(long id):通过id拿到一个Session
-
Remove(long id):移除一个session,并将其释放掉
-
Session Create(IPEndPoint ipEndPoint):通过一个IP地址与端口,主动创建一个Channel与之连接,然后创建一个Session与这个channel关联,并开始通信。这个方法用于创建一个主动连接,类似以客户端的方式连接到其他服务模块。
public Session Create(IPEndPoint ipEndPoint)
{
AChannel channel = this.Service.ConnectChannel(ipEndPoint);
Session session = ComponentFactory.CreateWithParent<Session, AChannel>(this, channel);
this.sessions.Add(session.Id, session);
session.Start();
return session;
}
- Session Create(string address):与上面方法类似,只不过传入的是一个字符串地址端口形式。
- void Update():由EventSystem统一驱动的Update方法,在里面驱动Service.Update(),从而调动发送处理。具体看Service与Channel的发送相关逻辑,前面已经记录过。
- override void Dispose():释放所有session,service等。
总结
本篇记录的是抽象类NetworkComponent组件的核心功能,他主要是根据不同的协议类型,创建不同的Service,同时对外提供主动创建session连接的能力,以及负责service监听与被动创建Session关联起来,同时负责所有session的管理。
下一篇,基于本篇记录下内网NetworkComponent与外网NetworkComponent的区别。