liuwenjun830

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
我是今年才毕业的应届生,找了一家公司,主要从事.net开发。公司让我从事Remoting开发,最近几天看了wayfarer的一些文章,觉得很好,自己也试着做了一个小程序,不知道为什么达不到预期的效果。
现在把程序发上来,希望大家能为我解决问题。
远程类:
using System;
using System.Runtime.Remoting;

namespace Distribution_Framework
{
    
//定义广播事件的参数类
    [Serializable]
    
public class BroadcastEventArgs : EventArgs
    
{
        
private string msg = null;
        
public BroadcastEventArgs(string message)
        
{
            msg 
= message;
        }

        
public string Message
        
{
            
get
            
{
                
return msg;
            }

        }

    }

    
public delegate void BroadcastEventHandler(object sender, BroadcastEventArgs submitArgs);
    
public class InfoCenter : MarshalByRefObject
    
{
        
private static int count= 0;
        
public InfoCenter()
        
{
            count 
= count+1;
            Console.Write(count.ToString());
            Console.WriteLine(
"InfoCenter created.");
        }

        
public override object InitializeLifetimeService()
        
{
            
return null;
        }

        
public event BroadcastEventHandler Broadcaster;
        
public void Broadcasting(string message)
        
{
            BroadcastEventArgs e 
= new BroadcastEventArgs(message);

            
if (Broadcaster != null)
            
{
                Broadcaster(
this, e);//发出事件
                Console.WriteLine("Broadcast:" + e.Message);
            }

        }

    }

}





服务端:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Serialization.Formatters;
using System.Collections;
//using System.Runtime.Remoting.Services;
//using directive;

namespace Distribution_Framework
{
    
class Server
    
{
        
public static void Main(string[] Args)
        
{
            RemotingConfiguration.Configure(
@"F:\Broadcast\Server\Server\Server.exe.config"); 

            
/*IDictionary channelProps = new Hashtable();
            channelProps["name"] ="BroadCaster";
            channelProps["priority"] =1;
            channelProps["port"]=8011;

            BinaryServerFormatterSinkProvider sinkProvider = new BinaryServerFormatterSinkProvider();
            sinkProvider.TypeFilterLevel =TypeFilterLevel.Full;
            HttpServerChannel channel = new HttpServerChannel(channelProps,sinkProvider);
            ChannelServices.RegisterChannel(channel);
*/


            Console.WriteLine(
"Server is running, Press Enter key to exit.");
            Console.ReadLine();
        

            
/*RemotingConfiguration.RegisterWellKnownServiceType(typeof(Distribution_Framework.InfoCenter), "Broadcast", WellKnownObjectMode.Singleton);
            HttpChannel myChannel = new HttpChannel(8011);
            ChannelServices.RegisterChannel(myChannel);

            IServerChannelSink sc = myChannel.ChannelSinkChain;
            while (sc != null)
            {
                if (sc is BinaryServerFormatterSink)
                {
                    ((BinaryServerFormatterSink)sc).TypeFilterLevel = TypeFilterLevel.Full;
                    //break;
                }
                if (sc is SoapServerFormatterSink)
                {
                    ((SoapServerFormatterSink)sc).TypeFilterLevel = TypeFilterLevel.Full;
                    //break;
                }
                sc = sc.NextChannelSink;
            }
            Console.WriteLine("Server is running, Press Enter key to exit.");
            Console.ReadLine();
        
*/



        }

    }

}


Annoncer:
using System;
using System.Timers;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;


namespace Distribution_Framework
{
    
class Announcer
    
{
        InfoCenter infoCenter;

        
public static void Main(string[] Args)
        
{
            
/*HttpChannel channel = new HttpChannel();
            ChannelServices.RegisterChannel(channel);
            RemotingServices.Connect(typeof(InfoCenter),"
http://localhost:8011/BroadCaster");*/

            Announcer announcer 
= new Announcer();
            announcer.Run();
            Console.WriteLine(
"The announcer has been started.");
            Console.ReadLine();
        }


        
public void Run()
        
{
            
try
            
{
                RemotingConfiguration.Configure(
@"F:\Broadcast\Announcer\Announcer\Announcer.exe.config");
                
//infoCenter = new InfoCenter();
                Timer timer = new Timer(1000);
                timer.Elapsed 
+= new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
                timer.Enabled 
= true;
            }

            
catch(Exception ex)
            
{
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
            }

        }


        
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        
{
            
string msg = "The Time is: " + DateTime.Now.ToString();
            Console.WriteLine(
"Send Message:" + msg);
            infoCenter.Broadcasting(msg.ToString());
        }

    }

}


客户端:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Collections;
using System.Runtime.Serialization.Formatters;

namespace Distribution_Framework
{
    
class Receiver : MarshalByRefObject
    
{
        InfoCenter infoCenter;
        
public Receiver()
        
{
        }


        
public override object InitializeLifetimeService() 
        
{
            
return null;
        }


        
public void Run()
        
{
            
try
            
{
                
//RemotingConfiguration.Configure(@"F:\Broadcast\Receiver\Receiver\Receiver.exe.config");
                HttpChannel channel = new HttpChannel();
                ChannelServices.RegisterChannel(channel);
                RemotingServices.Connect(
typeof(InfoCenter),"http://localhost:8011/BroadCaseter");
                infoCenter 
= new InfoCenter();
                
//订阅信息
                infoCenter.Broadcaster += new BroadcastEventHandler(this.BroadcastReceiver);
                
//infoCenter.Broadcasting("hello");
                Console.WriteLine("Ready to Recieve Message");
                Console.ReadLine();
            }

            
catch(Exception ex)
            
{
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }

            
//取消订阅
            
//infoCenter.Broadcaster -= new BroadcastEventHandler(this.BroadcastReceiver);
        }


        
public void BroadcastReceiver(object sender, BroadcastEventArgs args)
        
{
            Console.WriteLine(
"Received:" + args.Message);//打印接收信息
        }


        
public static void Main()
        
{
            Receiver receiver 
= new Receiver();
            receiver.Run();
        }

    }

}



在客户端如果用配置文件就报错,说<channels>附进有错误。
客户端配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   
<system.runtime.remoting>
      
<application>
         
<client>
            
<client url="http://localhost:8011/BroadCaster">
                
<activated type="Distribution_Framework.InfoCenter, InfoCenter"/>
            
</client>
         
<channels>
            
<channel ref="http" port="0"/>
                
<serverProviders>
                  
<provider ref="binary" typeFilterLevel="Full"/>
                
</serverProviders>
         
</channels>
      
</application>
   
</system.runtime.remoting>
</configuration>
posted on 2006-04-19 08:34  偷回忆的人  阅读(1526)  评论(2编辑  收藏  举报