NetOuterComponent
请大家关注我的微博:@NormanLin_BadPixel坏像素
namespace Model
{
public class NetOuterComponent: NetworkComponent
{
}
}
空空如也。有了之前的教训,这次我特意去找了找有没有扩展方法。果然不出所料。
public static class NetOuterComponentEx
我们看到,同客户端一样,也订阅了Awake和Update事件,并且有一个带参数的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了,我们要额外保存能标识客户端的数据。