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); } }
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); }
protected override void OnRemoteConnected(ISocket remote) { WrappedSocketsMap[remote] = new PairSocket(remote); }