远程处理的双向通信问题

来源:互联网 发布:北京软件就业培训 编辑:程序博客网 时间:2024/05/17 23:25

采用Remoting时,有时候需要双向通信,客户端到服务端是很容易的,服务端到客户端就比较麻烦,这里可以采用事件或委托来处理,都比较麻烦.
关于远程处理的一些注意事项:
  1. 在远程处理中切莫使用用户接口(UI),特别是远程事件中,否则可能出现一些莫名其妙,难以解释和处理的问题.
  2. 由于远程操作,则必然有延时等待,因此最佳做法是使用异步编程,使用多线程或异步调用(委托).
   3. 如果使用事件,则事件链越少越好,事件链越多,路由的事件就越多,性能就越低下,如果一个事件链出了问题,则会影响到整个事件链(该条款适用于单独对象)
单独对象事件路由示意图:

      如图所示,所有客户端注册的事件,都会被路由到,因此如果任一客户端事件路由失败,则导致此次事件路由失败!
这种模式使得系统急不稳定,当网路不通,或者非正常退出且没注销事件时就会出现路由失败,导致事件分发失败!!
因此尽量不采用这种方式!
     采用单次调用对象,导致每客户端都要创建一个实例
     导致这种情况的原因是,事件的基础是多播委托,当传播一个委托无法成功时则会出现错误
所以这种情况只有在网路

解决方案:
       对于这种问题的解决方案是,使用委托而不是事件,实现系统管理委托回调,而不是使用事件的自动回调,这里的解决方案是使用委托列表,而没有采用多播委托,列表中存储了客户端ID和和回调委托(字典),这样针对客户端调用委托,可避免上述问题,当一个失败时不至于像事件那样由于事件路由而中断整个(所有)客户端的运行。解决原理如下图所示:

       所有的这列路线都是并行而非串行的,这就避免了串行处理时,当一个节点出错则导致这次行动失败!
委托调用路线
注册回调函数路线
      关于使用委托,事件的安全性说明,使用委托或事件是不安全的做法,因此必须要对此进行必要的处理,比如客户端验证机制,加密机制等的应用.

原创粉丝点击