ET服务器框架学习笔记(十一)

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的区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值