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
后面的代码我就不讲了,都很好理解。