ITrackingHandler在MSDN中的解释是:指示实现对象必须得到由远程结构发出的有关对象与代理的封送处理、取消封送处理和断开的通知。
该接口有三个方法分别为:
接着实现ITrackingHandler接口, Tracker
然后在Client中实现IRemotingObjectDisconnected接口,部分代码如下
该接口有三个方法分别为:
1 /// <summary>
2 /// 通知当前实例某个对象已与其代理断开连接。
3 /// </summary>
4 /// <param name="obj">obj: 已断开连接的对象。</param>
5 void DisconnectedObject( object obj )
6
7 /// <summary>
8 /// 通知当前实例已将对象取消封送。
9 /// </summary>
10 /// <param name="obj">已封送的对象</param>
11 /// <param name="or">System.Runtime.Remoting.ObjRef,它由封送处理产生,并表示指定的对象。 </param>
12 void UnmarshaledObject( object obj, ObjRef or )
13
14 /// <summary>
15 /// 通知当前实例已封送对象
16 /// </summary>
17 /// <param name="obj">已取消封送的对象。</param>
18 /// <param name="or">表示指定对象的 System.Runtime.Remoting.ObjRef。 </param>
19 void MarshaledObject( object obj, ObjRef or )
2 /// 通知当前实例某个对象已与其代理断开连接。
3 /// </summary>
4 /// <param name="obj">obj: 已断开连接的对象。</param>
5 void DisconnectedObject( object obj )
6
7 /// <summary>
8 /// 通知当前实例已将对象取消封送。
9 /// </summary>
10 /// <param name="obj">已封送的对象</param>
11 /// <param name="or">System.Runtime.Remoting.ObjRef,它由封送处理产生,并表示指定的对象。 </param>
12 void UnmarshaledObject( object obj, ObjRef or )
13
14 /// <summary>
15 /// 通知当前实例已封送对象
16 /// </summary>
17 /// <param name="obj">已取消封送的对象。</param>
18 /// <param name="or">表示指定对象的 System.Runtime.Remoting.ObjRef。 </param>
19 void MarshaledObject( object obj, ObjRef or )
今天我们就实现ITrackingHandler接口来解决以下场景应用:
clientA和clientB同时连接到serverA上,这时由于网络原因或断电故障,clientA退出了,但在clientB上却还显示clientA还在线,
那么我们怎样才能帮clientB纠正这个错误呢?答案就是利用ITrackingHandler接口,请看:
首先定义一个接口IRemotingObjectDisconnected
1 // <summary>
2 /// 定义一个远程对象在与代理断开连接时需要进行相关处理的接口
3 /// </summary>
4 public interface IRemotingObjectDisconnected
5 {
6 /// <summary>
7 /// 处理远程对象销毁
8 /// </summary>
9 void ProcessObjectDisconnected();
10 }
11
2 /// 定义一个远程对象在与代理断开连接时需要进行相关处理的接口
3 /// </summary>
4 public interface IRemotingObjectDisconnected
5 {
6 /// <summary>
7 /// 处理远程对象销毁
8 /// </summary>
9 void ProcessObjectDisconnected();
10 }
11
接着实现ITrackingHandler接口, Tracker
1 /// <summary>
2 /// 实现一个远程对象的跟踪处理类
3 /// </summary>
4 public class Tracker : ITrackingHandler
5 {
6 #region Constructors
7 /// <summary>
8 /// 构造
9 /// </summary>
10 public Tracker(){}
11 #endregion
12
13 #region ITrackingHandler 成员
14 /// <summary>
15 /// 通知当前实例某个对象已与其代理断开连接
16 /// </summary>
17 /// <param name="obj"></param>
18 public void DisconnectedObject( object obj )
19 {
20 //如果远程对象obj实现了IRemotingObjectDisconnected接口,则让其处理断开连接
21 if ( obj is Interfaces.IRemotingObjectDisconnected )
22 ( obj as Interfaces.IRemotingObjectDisconnected ).ProcessObjectDisconnected();
23 }
24 /// <summary>
25 /// 通知当前实例已将对象取消封送。
26 /// </summary>
27 /// <param name="obj"></param>
28 /// <param name="or"></param>
29 public void UnmarshaledObject(object obj, ObjRef or)
30 {
31 }
32 /// <summary>
33 /// 通知当前实例已封送对象
34 /// </summary>
35 /// <param name="obj"></param>
36 /// <param name="or"></param>
37 public void MarshaledObject(object obj, ObjRef or)
38 {
39 }
40 #endregion
41 }
2 /// 实现一个远程对象的跟踪处理类
3 /// </summary>
4 public class Tracker : ITrackingHandler
5 {
6 #region Constructors
7 /// <summary>
8 /// 构造
9 /// </summary>
10 public Tracker(){}
11 #endregion
12
13 #region ITrackingHandler 成员
14 /// <summary>
15 /// 通知当前实例某个对象已与其代理断开连接
16 /// </summary>
17 /// <param name="obj"></param>
18 public void DisconnectedObject( object obj )
19 {
20 //如果远程对象obj实现了IRemotingObjectDisconnected接口,则让其处理断开连接
21 if ( obj is Interfaces.IRemotingObjectDisconnected )
22 ( obj as Interfaces.IRemotingObjectDisconnected ).ProcessObjectDisconnected();
23 }
24 /// <summary>
25 /// 通知当前实例已将对象取消封送。
26 /// </summary>
27 /// <param name="obj"></param>
28 /// <param name="or"></param>
29 public void UnmarshaledObject(object obj, ObjRef or)
30 {
31 }
32 /// <summary>
33 /// 通知当前实例已封送对象
34 /// </summary>
35 /// <param name="obj"></param>
36 /// <param name="or"></param>
37 public void MarshaledObject(object obj, ObjRef or)
38 {
39 }
40 #endregion
41 }
然后在Client中实现IRemotingObjectDisconnected接口,部分代码如下
1 public class Client: System.MarshalByRefObject, IRemotingObjectDisconnected
2 {
3 //
.
4
5 #region IRemotingObjectDisconnected 成员
6 /// <summary>
7 /// 处理 Client 的非正常退出
8 /// </summary>
9 public void ProcessObjectDisconnected()
10 {
11 //处理退出事件
12 this.Logout();
13 }
14 #endregion
15 }
2 {
3 //
.4
5 #region IRemotingObjectDisconnected 成员
6 /// <summary>
7 /// 处理 Client 的非正常退出
8 /// </summary>
9 public void ProcessObjectDisconnected()
10 {
11 //处理退出事件
12 this.Logout();
13 }
14 #endregion
15 }
至此大部分工作已完成了,接下来在服务器端我们将自定义的tracker跟踪处理程序注册到 System.Runtime.Remoting.Services.TrackingServices。
//注册自定义的跟踪处理程序
System.Runtime.Remoting.Services.TrackingServices.RegisterTrackingHandler( new RemotingObjects.Tracker() );
这样便可以了。
我们再来看看它们是如何工作起来的。
1:注册自定义跟踪处理程序.
2:发布远程对象( Client ).
3:客户端登录服务器获取对象 (生成clientA或clientB......).
4:clientA断电,clientA的租约到期,但由于clientA断电缘故,Sponsor没办法续约租约.
5:自定义的跟踪处理tracker跟踪到clientA已经与代理断开,由于clientA已经实现IRemotingObjectDisconnected接口,
遂调用clientA的ProcessObjectDisconnected方法.
6:clientA通过服务器通知clientB,clientA已断线.
