Handler & Payload Registry

Register Payload

User has to register Serialize & De-serialize functions of Payloads that defines how payloads get serialized while sending Network Message and get de-serialized while receiving Network Messages. Below is the sample code to register payload.

   /// <summary>
    /// Operation serialized/deserialized using build-in serializer
    /// </summary>
    public class PingOperation 
    {
        private const ushort MsgId = (ushort)MessageId.Ping;

        // properties
        public int pingCount;

        public static void Register()
        {
            FN.RegisterPayload((ushort)MsgId, Serialize, Deserialize);
        }

        public static object Deserialize(ArraySegment<byte> buffer)
        {
            var data = BitBufferPool.GetInstance();
            data.FromArray(buffer);

            var _payload = Acquire();      // release it after use [see PingCountHandler.cs ln 21]
            _payload.pingCount = data.ReadInt();
            
            data.Clear();
            return _payload;     
        }

        public static ArraySegment<byte> Serialize(object pingOperation)
        {
            var op = pingOperation as PingOperation;
            var data = BitBufferPool.GetInstance();
            data.Clear();
            data.AddInt(op.pingCount);
            return data.ToArray();
        }

Register Handler

Handlers are object oriented way to handle incoming network messages.

Create an Handler

    public class LoginMessageHandler : IHandler
    {
        public ushort MsgId => (ushort)MessageId.Login;

        public void HandleMessage(Message message, uint PeerId)
        {
            var sender = FN.PeerCollection.GetPeerByID(PeerId);
            PayloadData payload = (message.Payload as PayloadData);

            string userName = payload.Data[0] as string;
            string password = payload.Data[1] as string;

            FN.Logger.Info($"Login Request sent by: {userName}");

            var reply = Message.Acquire();
            reply.CopyFrom(message);

            PayloadData data_payload = new PayloadData()
            {
                Data = new System.Collections.Generic.Dictionary<byte, object>() 
                {
                    {0, true },                     // sucessful login
                    {1, Guid.NewGuid().ToString() } // auth token
                }
            };

            reply.Payload = data_payload;

            FN.Server.SendMessage(sender, reply, DeliveryMethod.Reliable, 0);
            
            Message.Release(reply);
        }
    }

Register a handler

FN.HandlerCollection.RegisterHandler(new LoginMessageHandler());

Trigger HandleMessage method of handlers with this syntax in OnNetworkReceive method of ISocketListener of IClientSocket or IServerSocket

public void OnNetworkReceive(Message message, uint sender)
{
    bool handled = FN.HandlerCollection.HandleMessage(message, sender);
    if (!handled)
    {
        // no handler is registered against coming msg, mannually handle it here
    }
}

Last updated

Was this helpful?