예제 #1
0
        protected override int OnRemoteMessage(ISocket remote)
        {
            PairSocket remotePair = remote != null ? WrappedSocketsMap[remote] : this;

            var envelope = remotePair.Read();

            if (envelope == null)
            {
                HandleDisconnect(remotePair);
                return(0);
            }
            else
            {
                ProtocolHandler.HandleMessage(this, remotePair, envelope);
                return(envelope.Length);
            }
        }
예제 #2
0
        private void HandleDisconnect(PairSocket remotePair)
        {
            if (remotePair.LastWill != null)
            {
                ProtocolHandler.HandleMessage(this, remotePair, remotePair.LastWill);
            }


            //Remove subscribers do cliente caso não seja do tipo Persistent
            List <PubSubQueue> queuesByPair;

            if (SubscriberSockets.TryGetValue(remotePair, out queuesByPair))
            {
                for (var i = 0; i < queuesByPair.Count; i++)
                {
                    var queue = queuesByPair[i];
                    queue.RemoveSubscriber(remotePair, false);
                    if (queue.CanDispose)
                    {
                        Queue.Remove(queue.Name);
                    }
                }
            }

            //Caso seja um cliente, libera os recursos alocados por ele
            if (remotePair != this)
            {
                WrappedSocketsMap.Remove(remotePair.Socket);
                IdentityConnectionSocketsMap.Remove(remotePair);
                remotePair.Dispose();
            }

            remotePair.Close();

            OnClientDisconnect?.Invoke(remotePair);
        }
예제 #3
0
 protected override void OnRemoteConnected(ISocket remote)
 {
     WrappedSocketsMap[remote] = new PairSocket(remote);
 }