void IMessageAckHelperListener <NatIdentifierResponseMessage> .MessageAckHelperReceivedExpectedResponse(NetEndPoint from, NatIdentifierResponseMessage message)
        {
            ThreadChecker.AssertUnreliableChannel();

            this.router.dispatcher.Enqueue(() => new NatIdentifierResponseExecutor <TPlayer>().Execute(this, message));
            this.natIdentifierAckHelper = null;
        }
        void IMessageAckHelperListener <NatIdentifierResponseMessage> .MessageAckHelperFailed()
        {
            ThreadChecker.AssertUnreliableChannel();

            this.Disconnect();
            this.natIdentifierAckHelper = null;
        }
        public GameClient(NetworkClient networkClient, GameClientMessageRouter <TPlayer> router)
        {
            ThreadChecker.AssertMainThread();

            this.networkClient          = networkClient;
            this.networkClient.listener = this;

            this.natIdentifierAckHelper = new MessageAckHelper <NatIdentifierRequestMessage, NatIdentifierResponseMessage>(
                this.networkClient.unreliableChannel, router, 10, 2F
                )
            {
                listener = this
            };

            this.router = router;
            this.router.Configure(this);
        }