我是今年才毕业的应届生,找了一家公司,主要从事.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>
现在把程序发上来,希望大家能为我解决问题。
远程类:


































































































































































































































客户端配置文件:


















【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步