ET框架-服务端-NetOuterComponent学习笔记

NetOuterComponent

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


namespace Model
{
    public class NetOuterComponent: NetworkComponent
    {
    }
}

空空如也。有了之前的教训,这次我特意去找了找有没有扩展方法。果然不出所料。

public static class NetOuterComponentEx

我们看到,同客户端一样,也订阅了AwakeUpdate事件,并且有一个带参数的Awake方法,参数是IP地址。

public static void Awake(this NetOuterComponent self, IPEndPoint ipEndPoint)
{
    self.Awake(NetworkProtocol.TCP, ipEndPoint);
    self.MessagePacker = new ProtobufPacker();
    self.MessageDispatcher = new OuterMessageDispatcher();
}

从这里我们知道,它对消息的打包工具是ProtobufPacker,消息调度器是OuterMessageDispatcher

OuterMessageDispatcher

我们首先来对比一下服务端和客户端接收到消息后需要做的处理。

客户端在接收到消息后,只要在自己的mono层跟热更层进行调度就可以了,但是,如果服务端接收到客户端的消息,除了在自己管理的服务层进行消息调度外,客户端发送的消息还有可能需要我们去访问其他的服务器,这个时候,就需要我们服务器之间的通讯。这就需要用到我们之前学习的Actor方面的知识。(Actor我们还没学全呢。)

// gate session收到actor消息直接转发给actor自己去处理
if (message is IActorMessage)
{
    long actorId = session.GetComponent<SessionUserComponent>().User.ActorID;
    ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(actorId);
    actorProxy.Send((IMessage)message);
    return;
}

// gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
if (message is IActorRequest aActorRequest)
{
    long actorId = session.GetComponent<SessionUserComponent>().User.ActorID;
    ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(actorId);
    IResponse response = await actorProxy.Call(aActorRequest);
    session.Reply(packetInfo.RpcId, response);
    return;
}

我们发现,ET框架里面的消息类型真的太多了,我想写一个关于消息类型的笔记

经过上面笔记的洗礼,大家对这里为什么要这样处理消息应该都明了了吧哈哈。不过我们还得来看看它是怎么定位ActorProxy的。

我们看到,当客户端往服务端发送消息时,通过Session就可以标识客户端,但是服务端再发送给其他服务器时,就得重新包装一下了,这个时候,Session已经是服务器与服务器对话的Session了,我们要额外保存能标识客户端的数据。

阅读更多

没有更多推荐了,返回首页