急需解决啊,Remoting 事件注册不了

miyoo miyoo 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一、远程接口定义

namespace KnownObjects
{
/// <summary>
/// 报警结构体
/// </summary>
[Serializable]
public struct ALARM
{
public string ipAddress;
public string hostName;
public string alarmTime;
public string alarmMess;

}
/// <summary>
/// 报警客户端
/// </summary>
public interface IAlarmClient
{
/// <summary>
/// 消息反馈
/// </summary>
/// <param name="message">A message.</param>
object ReceiveMessage(ALARM message);
}

/// <summary>
/// 报警消息通用方法
/// </summary>
public interface IAlarmRoom
{
/// <summary>
/// 发送报警信息到所有客户端
/// </summary>
/// <param name="message">Message to send.</param>
void SendMessage(ALARM message);

/// <summary>
/// 注册报警客户端
/// </summary>
/// <param name="iAlarmClient"></param>
void AttachClient(IAlarmClient iAlarmClient);
}
}

二、客户接收端

namespace ReceiveClient
{

/// <summary>
/// ChatClient demostrates simple client application.
/// </summary>
public class ReceiveAlarm : MarshalByRefObject, IAlarmClient
{
public class AlarmMsgEventArgs : EventArgs
{

// 1. Type defining information passed to receivers of the event
public AlarmMsgEventArgs(String ip, String hostname, String mess, String time)
{
this.ip = ip;
this.hostname = hostname;
this.mess = mess;
this.time = time;
}
public readonly String ip, hostname,mess,time;
}
//报警消息委托
public delegate void AlarmMsgEventHandler(Object sender,AlarmMsgEventArgs args);
//报警消息事件
public event AlarmMsgEventHandler AlarmMsg;
//负责通知事件的登记对象
protected virtual void OnAlarmMsg(AlarmMsgEventArgs e)
{

// Has any objects registered interest with our event?
if (AlarmMsg != null)
{
// Yes, notify all the objects
AlarmMsg(this, e);
}
}

private IAlarmRoom iAlarmRoom;

/// <summary>
/// Sigleton instance.
/// </summary>
public static ReceiveAlarm Instance = new ReceiveAlarm();

public ReceiveAlarm()
{
}
//连接服务器
public bool InitRemoting()
{
try
{
System.Configuration.ConfigurationSettings.GetConfig("DNS");
GlobalEventContainer.GenuineChannelsGlobalEvent += new GenuineChannelsGlobalEventHandler(GenuineChannelsEventHandler);
RemotingConfiguration.Configure("Client.exe.config");
iAlarmRoom = (IAlarmRoom)Activator.GetObject(typeof(IAlarmRoom), "gtcp://127.0.0.1:8737/ChatRoom.rem");
iAlarmRoom.AttachClient(ReceiveAlarm.Instance);


}
catch (System.Exception e)
{
Console.WriteLine("异常错误:服务器未启动?");
return false;
}

return true;
}

public static void GenuineChannelsEventHandler(object sender, GlobalEventArgs e)
{
Console.WriteLine("Global event: {0}, Url: {1}, Exception: {2}", e.EventType, e.Url, e.SourceException);
if (e.EventType == GlobalEventTypes.GTcpConnectionClosed &&
e.SourceException is OperationException &&
((OperationException)e.SourceException).OperationErrorMessage.ErrorIdentifier.IndexOf("ServerHasBeenRestarted") > -1)
{
// server has been restarted so we have to register our listener again
IAlarmRoom iAlarmRoom = (IAlarmRoom)Activator.GetObject(typeof(IAlarmRoom), "gtcp://127.0.0.1:8737/ChatRoom.rem");
iAlarmRoom.AttachClient(ReceiveAlarm.Instance);
}
}

/// <summary>
/// 接收到报警信息.实现了远程接口的方法
/// </summary>
/// <param name="message">The message.</param>
public object ReceiveMessage(ALARM message)
{
///测试,接收到消息后触发本地自定义事件,但是有问题,AlarmMsg=null;测试类在后面
AlarmMsgEventArgs e = new AlarmMsgEventArgs(message.ipAddress, message.hostName, message.alarmMess, message.alarmTime);
OnAlarmMsg(e);
//这里能够打印出远程传来的信息
Console.WriteLine("{0},{1},{2},{3}",message.ipAddress, message.hostName, message.alarmMess, message.alarmTime);

return null;
}

public void ArrivingMsg(string ip, string hostname, string mess, string time)
{
AlarmMsgEventArgs e = new AlarmMsgEventArgs(ip, hostname, mess, time);
OnAlarmMsg(e);
//Console.WriteLine("Msg...(AppDomain:{0} {1})", AppDomain.CurrentDomain.FriendlyName,mess);
}

/// <summary>
/// This is to insure that when created as a Singleton, the first instance never dies,
/// regardless of the expired time.
/// </summary>
/// <returns></returns>
public override object InitializeLifetimeService()
{
return null;
}
}
}


三、测试类

namespace ReceiveClient
{
public class Program
{
static void Main(string[] args)
{
ReceiveAlarm receive = new ReceiveAlarm();
receive.InitRemoting();
Receiver test = new Receiver(receive);
Console.ReadLine();
}
}
//测试类
//ReceiveAlarm对象以参数形式传递给测试类,
public class Receiver
{
public Receiver(ReceiveAlarm mm)
{
//注册事件
mm.AlarmMsg += new ReceiveAlarm.AlarmMsgEventHandler(RecMsg);
}

private void RecMsg(Object sender, ReceiveAlarm.AlarmMsgEventArgs e)
{
Console.WriteLine(" Receiving message:");
Console.WriteLine(" IP: {0}\n HostName: {1}\n Message: {2}\n Time {3}\n", e.ip, e.hostname, e.mess, e.time);
}

public void UnRegister(ReceiveAlarm mm)
{
mm.AlarmMsg -= new ReceiveAlarm.AlarmMsgEventHandler(RecMsg);
}
}
}

四、问题
这是个Remoting 的广播事件,ReceiveAlarm能够注册服务器,并接收到信息(继承IAlarmClient),
我的目的是,在接收到了远程消息后,让他触发我自定义的事件,这样在GUI界面中就可以显示报警信息。
Receiver类测试接收类,注册事件,但触发不了?
...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
miyoo
.NET Framework 17,748 成员 24,324 内容