Esempio n. 1
0
            static IEnumerable <IOutboundPacket> OnPacketReady(IConnection connection, IIncomingPacket packet)
            {
                var handler = handlerSelector.SelectForPacket(packet);

                if (handler != null && clientMap.TryGetValue(connection, out IClient client))
                {
                    return(handler.HandleRequest(packet, client));
                }

                return(null);
            }
Esempio n. 2
0
        /// <summary>
        /// Binds the TCP listener events with handler picking.
        /// </summary>
        /// <param name="loggerFactory">The loggers factory to create loggers with.</param>
        /// <param name="handlerSelector">The selector of handlers to bind listeners' events to.</param>
        /// <param name="listeners">The listeners to bind.</param>
        private void BindListeners(ILoggerFactory loggerFactory, IHandlerSelector handlerSelector, IEnumerable <IListener> listeners)
        {
            IEnumerable <IOutboundPacket> OnPacketReady(IConnection connection, IInboundPacket packet)
            {
                var handler = handlerSelector.SelectForPacket(packet);

                if (handler != null && this.connectionToClientMap.TryGetValue(connection, out IClient client))
                {
                    return(handler.HandleRequestPacket(this, packet, client));
                }

                return(null);
            }

            void OnConnectionClosed(IConnection connection)
            {
                // Clean up the event listeners we set up here.
                connection.PacketReady -= OnPacketReady;
                connection.Closed      -= OnConnectionClosed;

                if (!this.connectionToClientMap.ContainsKey(connection))
                {
                    return;
                }

                var playerId = this.connectionToClientMap[connection].PlayerId;

                this.clientsManager.Unregister(playerId);
                this.connectionToClientMap.Remove(connection);
            }

            void OnNewConnection(IConnection connection)
            {
                if (this.connectionToClientMap.ContainsKey(connection))
                {
                    return;
                }

                this.connectionToClientMap.Add(connection, new ConnectedClient(loggerFactory.CreateLogger <ConnectedClient>(), connection));

                connection.PacketReady += OnPacketReady;

                connection.Closed += OnConnectionClosed;
            }

            foreach (var tcpListener in listeners)
            {
                tcpListener.NewConnection += OnNewConnection;
            }
        }