ET框架---NetOuterComponent

NetOuterComponent

请大家关注我的微博:@NormanLin_BadPixel坏像素


这个应该是跟网络相关了,看了这么久的代码,终于要开始接触网络了吗,想想还有点小激动呢。废话不多说,直接看代码。

首先,这是一个继承于NetworkComponent的类,我们先去看一下它的父类。

NetworkComponent

private AService Service;

AService

public abstract AChannel GetChannel(long id);

public abstract Task<AChannel> AcceptChannel();

public abstract AChannel ConnectChannel(string host, int port);

新的东西真的很多,希望大家耐心看下去。我也是第一次接触,所以会比较啰唆。

AChannel

[Flags]
public enum PacketFlags
{
    None = 0,
    Reliable = 1 << 0,
    Unsequenced = 1 << 1,
    NoAllocate = 1 << 2
}

这是用位域来储存的一个枚举,从名字我们就可以看出来,这是用来区分不同数据包的连接类型的。而后面的ChannelType应该是这个数据通道的类型,看起来像是一个接收通道一个发送通道。

后面的代码大家看看,都应该能理解,无非是添加了一个处理报错信息的回调。

重要的是后面的方法

/// <summary>
/// 发送消息
/// </summary>
public abstract void Send(byte[] buffer, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable);

public abstract void Send(List<byte[]> buffers, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable);

/// <summary>
/// 接收消息
/// </summary>
public abstract Task<byte[]> Recv();

作者也注释了一些,发送消息和接收消息,我们需要记住这几个方法。
这里其实我遇到了一个我不是很了解的东西,Task

NetworkComponent

private readonly Dictionary<long, Session> sessions = new Dictionary<long, Session>();

真的是,一段代码一个新玩意啊。这个session,很有可能就是我们常说的会话控制了,别问我为什么,我猜的。

Session

好长,分P吧。Session学习笔记

经过漫长的Session学习,我默认大家都聪明的了解了Session。
所以我们知道,每一个NetworkComponent都储存了一组Session。每个Session里面又独自管理了AChannel,起到了收发网络信息的作用。

NetworkComponent

public IMessagePacker MessagePacker { get; set; }
public IMessageDispatcher MessageDispatcher { get; set; }

这俩个东西就是我们在Session里面提到的对消息进行打包和分发的东西。

之后的Awake方法,里面会根据传入的参数建立TService或者KService。其实就是建立TCP连接还是KCP连接的区别。这里我们分个P,了解一下TService和KService

我们看到,带远端网络端点信息参数的Awake方法里面在创建相应的Service后,会调用StartAccept方法,在这个方法中,则是异步去调用Accept方法。

public virtual async Task<Session> Accept()
{
    AChannel channel = await this.Service.AcceptChannel();
    Session session = ComponentFactory.CreateWithId<Session, NetworkComponent, AChannel>(IdGenerater.GenerateId(), this, channel);
    session.Parent = this;
    channel.ErrorCallback += (c, e) => { this.Remove(session.Id); };
    this.sessions.Add(session.Id, session);
    return session;
}

我们看到,这个方法是通过异步的方式去返回一个Session,这里,我们通过ComponentFactory来创建新的Session。并把它存入sessions中。

ComponentFactory

这里提供了很多泛型静态方法,大部分是用对象池来创建一个新的Component。并且,尝试对该Component调用Awake方法。在这里,我们知道了,我们之前学习的ObjectEvent当中的Awake方法是在这里调用的。而在3.0当中,ObjectEvent已经被改成EventSystem了,没看过的可以去看一下EventSystem学习笔记

NetworkComponent

后面的代码我就不讲了,都很好理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值