在命名管道中为每个客户端注册一个名称

本文关键字:一个 注册 客户端 管道 | 更新日期: 2023-09-27 18:31:58

在进程间通信中,我有一个启动NamedPipe的PipeServer进程和其他一些连接到该进程的客户端,并且有一些消息协议需要处理。

在某些情况下,我只想将消息从服务器发送到一个客户端。那么,有没有办法在连接到服务器时为每个客户端注册一个名称?

在命名管道中为每个客户端注册一个名称

可以使用基于列表的发布-订阅模式。你要做的是修改订阅调用以包含客户端ID,然后将其存储在列表中,当你想向特定客户端宣布时,只需获取list元素并使用回调。下面边缘的东西:

    public interface ISampleClientContract
    {
        [OperationContract(IsOneWay = true)]
        void AnnounceSomeStuff();
    }
    public class Subscriber
    {
        public ISampleClientContract Callback { get; set; }
        public Guid ID { get; set; }
    }
    private List<Subscriber> MyClients = new List<Subscriber>();
    public void Subscribe(Guid id)
    {
        MyClients.Add(new Subscriber
            { 
                Callback = OperationContext.Current.GetCallbackChannel<ISampleClientContract>()
                ID = id
            });
    }
    public void Unsubscribe(Guid ID)
    {
        MyClients.Remove(o => o.ID == id).First());
    }
    public void NotifyClient(Guid id)
    {
        try
        {
            MyClients.Where( o => o.ID == id).First().Callback.AnnounceSomeStuff();
        }
        catch
        {
            MyClients.Remove(MyClients.Where(o => o.ID == id).first()); //instance dead?
        }
    }
    public void AnnounceToAll()
    {
        MyClients.ForEach(o => o.Callback.AnnounceSomeStuff());
    }