.Net Remoting实现定向广播
如果想利用该技术作一个简单而又典型的应用,信息广播程序是一个不错的选择。以下代码是一个简单的广播程序,当然,它实在太简陋了。
服务端:
Code class Program { static void Main(string[] args) { BinaryServerFormatterSinkProvider sfsp = new BinaryServerFormatterSinkProvider(); sfsp.TypeFilterLevel = TypeFilterLevel.Full; Hashtable props = new Hashtable(); props["port"] = 8086; TcpChannel channel = new TcpChannel(props, null, sfsp); ChannelServices.RegisterChannel(channel, false); SayHello sayHello = new SayHello(); RemotingServices.Marshal(sayHello, "SayHello"); Console.ReadKey(); sayHello.Say("Mike", "Hello, Mike"); Console.ReadKey(); sayHello.Say("John", "Hello, John"); Console.ReadKey(); } } |
客户端:
Code class Program { static void Main(string[] args) { BinaryServerFormatterSinkProvider sfsp = new BinaryServerFormatterSinkProvider(); sfsp.TypeFilterLevel = TypeFilterLevel.Full; Hashtable props = new Hashtable(); props["port"] = 0; TcpChannel channel = new TcpChannel(props, null, sfsp); ChannelServices.RegisterChannel(channel, false); SayHello sh = (SayHello)Activator.GetObject(typeof(SayHello), "tcp://localhost:8086/SayHello");
SayEventReappear re = new SayEventReappear(); re.ClientId = "John"; sh.OnSay += new SayHandler(re.Say); re.OnSay += new SayHandler(re_OnSay); Console.ReadKey(); } static void re_OnSay(string text) { Console.WriteLine(text); } } |
远程对象、委托及事件重现器(需同时部署在服务端及客户端):
Code public class SayHello : MarshalByRefObject { public event SayHandler OnSay; public void Say(string clientId, string text) { if (this.OnSay != null) this.OnSay(text); } } public delegate void SayHandler(string text); public class SayEventReappear : MarshalByRefObject { public event SayHandler OnSay; public void Say(string text) { if (this.OnSay != null) this.OnSay(text); } } |
OK,我的信息广播程序就这样完成了。
但是,我很快就发现了问题:如果我的确想让所有订阅我的广播事件的客户端都得到我要广播的信息,这个实现应该不会有问题。但是现在我有一个消息只想通知 Mike 或 John (正如以上代码),(注:可能这时不能再称为“广播”了),我的广播程序依然将这个消息通知到了每一个客户端。
可以想到的一个方法是,让事件重现器(SayEventReappear)接收到信息后先判断一下是不是发给自己的,只有发给自己的信息才激发本地事件(代码比较容易实现,不再贴出源码)。但是,这种处理只是在客户端将信息忽略而己,服务器端是照常广播了,如果你的信息非常机密,或者带宽非常有限,这显然不是好的解决办法。
考虑到 .Net Remoting 客户端订阅事件的实现原理:事件重现器在客户端实例化,并由服务器对按引用方式对其远程调用(个人理解,未经确认,欢迎指正)。如果将事件重现器订阅服务器端事件改为向服务器端“注册”事件重现器,逻辑上应该可行,这样就可以让每个客户端注册的事件重现器携带自己的客户标识,让服务端根据标识决定是否引发特定客户端的事件。修改后的代码如下:
远程对象:
Code public class SayHello : MarshalByRefObject { private List reList = new List(); public void Say(string clientId, string text) { foreach (SayEventReappear re in this.reList) { if (re.ClientId == clientId) re.Say(text); } } public void AddEventReappear(SayEventReappear re) { this.reList.Add(re); } } |
客户端程序:
sh.OnSay += new SayHandler(re.Say);改为 sh.AddEventReappear(re); |
OK,服务端分别检测每一个客户端的Id,然后只引发特定客户端的事件,真正的“定向广播”实现了。
但是检查一下以上代码,会发现依然存在问题:由于事件重现器的实例存在于客户端,服务端访问的是它的代理类,因此每次对 ClientId 的检查都是一次远程调用,这无疑是一种浪费
补充:Web开发 , ASP.Net ,
- 更多asp疑问解答:
- asp正则过滤重复字符串的代码
- 用asp过滤全部html但保留br类似的符号
- 会asp,但感觉asp要过点,想学php。但我一般做的都是小公司的站,用access数
- PHP的空间可以用ASP的源代码吗?
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 想做一个市级的人才网acess,sql数据库,语言asp,jsp,php分别用哪种好
- jsp,asp,php 区别
- 我想找一个有比较多漏洞的网站的源码,比如可以asp,php注入等都可以。供学习研究用。请提供下载地址。。
- 现在候找人做个网站,用ASP,还是PHP语言去做好
- asp,php ,jsp,.net 对于做网站前台的重要吗?
- asp和php的区别是什么?
- 我是新手SEO菜鸟 请问wp dw php asp cms myspl dede 这些软件应该如何区分呀?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?