• Newlife.Net QA


    Q1:当数据包很大时,客户端可以成功发送大的数据包,为什么服务端收到的数据包却被限制为缓冲区的大小64K?

    A1:

    这里传入的参数SocketAsyncEventArgs实例即e的缓冲区大小为64K,并不是客户端发送的600K,这个缓冲区的大小是由se决定的? 经验证(增大se的缓冲区大小,使它大于发送的数据包大小,则数据包可以正确接收),上述推断正确。

    Q2: 有新会话的处理,NewSession的回调问题,NewSession的回调函数被绑定为Server_NewSession,不是会递归调用这个函数,造成死循环?

    A2 :这里需要注意的是,虽然Server_NewSession是在NetServer中定义的,NetServer的NewSession委托却并没有被指定为Server_NewSession.例如,对于TCP通信,启动TCPServer进行监听初始化时,会对TCPServer的NewSession绑定,TCPServer继承自ISocektServer,所以TCPSerever的NeSession被绑定为Server_NewSession,而NetServer中的NewSession默认为null,不会造成递归调用,从而形成死循环。

    梳理一下自定义服务器的实现流程:

     自定义服务器:NetServer<自定义服务器对应的Session> ,通过调用NetServer.Start()函数启动,进一步调用NetServer.OnStart()方法,在此方法中根据协议类型创建了TCP,UDP,IPv4,IPv6的服务器实例(如TCPServer),对服务器实例绑定NewSession事件。对于TCPServer,当收到Accept请求时,创建Session,并触发NewSession,执行上面的函数;对于UPDServer,会直接触发receive。

          处理accept 或者receive是又服务器实例类型决定的,TCPServer和UDPServer的Start函数内容不同。

    Q3: 

           这个事件是在哪里定义的回调函数?具体回调流程处理又是怎样?

    A2:

          有两个地方定义了Received事件,一个是服务器的,一个是会话的,注意区分。

         1.服务器(NetServer继承自IServer)

      2.会话(INetSession)

    这个事件回调函数的定义在有新的会话进入时(对TCP是有新的连接,对UDP是收到新的数据包)

    可以看到,回调函数被定义为OnReceived,这里是处理的Session的Received。同上,并没有对NetServer定义的Received进行绑定,所以这里的Received为null

    这里提供了一个钩子,最后的OnReceive对会话和packet处理可以在自定义服务器中进行处理 。

    虽然进行了复杂的绑定,但在TCP通信时,收包事件触发后并没有通过触发OnReceived调用OnReceive,而是直接调用的OnReceive函数

  • 相关阅读:
    Unity4.5版本DLL库名字问题
    Unity路径规划
    Unity 父物体与子物体位置
    Moving in Unity
    C# Xml文件操作,解释见注释
    发个招聘信息
    Unity 视频播放杂谈
    unity中Debug输出控制
    编写可读代码艺术之表面层析
    匈牙利命名法,骆驼命名法(camel),帕斯卡(Pascal)命名法(转)
  • 原文地址:https://www.cnblogs.com/mbaymax/p/11357614.html
Copyright © 2020-2023  润新知