在命名管道中为每个客户端注册一个名称
本文关键字:一个 注册 客户端 管道 | 更新日期: 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());
}