100165484.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 245 行 · 第 1/3 页
HTM
245 行
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("EventSink: Event occurred: " + e.Message);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">5. </span><span style="FONT-FAMILY: 黑体">客户机</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">客户机通过</span><span lang="EN-US">RemotingConfiguration</span><span style="FONT-FAMILY: 宋体">类读取客户机配置文件。这与以前客户机的行为没有区别。客户机在本地创建远程接收器类</span><span lang="EN-US">EventSink</span><span style="FONT-FAMILY: 宋体">的实例。从服务器上的远程对象中调用的方法被传递给远程对象:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">using System;</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">using System.Runtime.Remoting;</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">namespace Wrox.ProCSharp.Remoting</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> class Client</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> static void Main(string[] args)</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> RemotingConfiguration.Configure("Client.exe.config");</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">不同的是,必须在本地创建远程接收器类</span><span lang="EN-US">EventSink</span><span style="FONT-FAMILY: 宋体">的实例。由于不使用</span><span lang="EN-US"><client></span><span style="FONT-FAMILY: 宋体">元素配置</span><span lang="EN-US">EventSink</span><span style="FONT-FAMILY: 宋体">类,因此它在本地实例化。接下来,实例化远程对象类</span><span lang="EN-US">RemoteObject</span><span style="FONT-FAMILY: 宋体">。在</span><span lang="EN-US"><client></span><span style="FONT-FAMILY: 宋体">元素中配置</span><span lang="EN-US">RemoteObject</span><span style="FONT-FAMILY: 宋体">类,因此它是在服务器上实例化的:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> EventSink sink = new EventSink();</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> RemoteObject obj = new RemoteObject();</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">现在,在远程对象中注册</span><span lang="EN-US" style="COLOR: black">EventSink</span><span style="COLOR: black; FONT-FAMILY: 宋体">对象的处理程序方法。</span><span lang="EN-US" style="COLOR: black">StatusEvent</span><span style="COLOR: black; FONT-FAMILY: 宋体">是在服务器中定义的委托名称。</span><span lang="EN-US" style="COLOR: black">StatusHandler()</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法的参数与在</span><span lang="EN-US" style="COLOR: black">StatusEvent</span><span style="COLOR: black; FONT-FAMILY: 宋体">中定义的参数完全相同。</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">调用</span><span lang="EN-US" style="COLOR: black">LongWorking()</span><span style="COLOR: black; FONT-FAMILY: 宋体">时,服务器将在方法的开始和结尾处调用方法</span><span lang="EN-US" style="COLOR: black">StatusHandler()</span><span style="COLOR: black; FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> // register client sink in server - subscribe to event</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> obj.Status += new StatusEvent(sink.StatusHandler);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> obj.LongWorking(5000);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">现在不用再考虑接收来自服务器的事件和取消订阅事件,原因是,下一次调用</span><span lang="EN-US">Long Working()</span><span style="FONT-FAMILY: 宋体">时,不接收事件:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> // unsubscribe from event</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> obj.Status -= new StatusEvent(sink.StatusHandler);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> obj.LongWorking(5000);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("press return to exit");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Console.ReadLine();</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">下面介绍客户机配置文件的内容。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">客户机的配置文件是</span><span lang="EN-US">client.exe.config</span><span style="FONT-FAMILY: 宋体">,它与客户激活的对象</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">这类对象前面介绍过</span><span lang="EN-US">) </span><span style="FONT-FAMILY: 宋体">的配置文件几乎完全相同。惟一不同的是定义信道的端口号。由于服务器必须使用已知的端口才能到达客户机,因此必须把信道的端口号定义为</span><span lang="EN-US"><channel></span><span style="FONT-FAMILY: 宋体">元素的特性。因为客户将使用运算符</span><span lang="EN-US">new</span><span style="FONT-FAMILY: 宋体">在本地实例化</span><span lang="EN-US">EventSink</span><span style="FONT-FAMILY: 宋体">类,所以不必为这个类定义</span><span lang="EN-US"><service></span><span style="FONT-FAMILY: 宋体">段。服务器不是通过名称访问</span><span lang="EN-US">EventSink </span><span style="FONT-FAMILY: 宋体">类的对象,而是接收对这个实例的编组引用:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"><configuration></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <system.runtime.remoting></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <application FTEL="Client"></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <client url="http://localhost:6791/CallbackSample"></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <activated type="Wrox.ProCSharp.Remoting.RemoteObject, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> RemoteObject" /></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </client></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <channels></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <channel ref="http" port="0" /></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <serverProviders></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 98.55pt"><span lang="EN-US"><provider ref="binary" typeFilterLevel="Full" /></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </serverProviders></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </channel></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </channels></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </application></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </system.runtime.remoting></span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"></configuration></span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">6. </span><span style="FONT-FAMILY: 黑体">运行程序</span></h4>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">在服务器上看到的结果如图</span><span lang="EN-US" style="COLOR: black">16-17</span><span style="COLOR: black; FONT-FAMILY: 宋体">所示。因为我们拥有客户激活的对象,所以远程对象的构造函数被调用一次;接下来,开始调用</span><span lang="EN-US" style="COLOR: black">LongWorking()</span><span style="COLOR: black; FONT-FAMILY: 宋体">,激发客户事件;之后,由于客户已经注销其关心的</span><span lang="EN-US" style="COLOR: black">LongWorking()</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法,所以以后对</span><span lang="EN-US" style="COLOR: black">LongWorking()</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法的调用不会激发事件。</span></p>
<p align="center"><span lang="EN-US"><img height="121" src="16/image017.jpg" width="277" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="COLOR: black; FONT-FAMILY: 宋体">图</span><span lang="EN-US" style="COLOR: black"> 16-17</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">在客户端,可以看到如图</span><span lang="EN-US" style="COLOR: black">16-18</span><span style="COLOR: black; FONT-FAMILY: 宋体">所示的结果。</span></p>
<p align="center"><span lang="EN-US"><img height="68" src="16/image018.jpg" width="363" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="COLOR: black; FONT-FAMILY: 宋体">图</span><span lang="EN-US" style="COLOR: black"> 16-18</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165483.htm">上一页</a> <a href="index.html">首页</a> <a href="100165485.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165484.htm'><font color='red'>16.6.5 远程调用和事件</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165481.htm'>16.6.2 驻留应用程序</a></div><div style='float:right;width:49%'>·<a href='100165482.htm'>16.6.3 类、接口和Soapsuds</a></div><div style='float:left;width:49%'>·<a href='100165483.htm'>16.6.4 异步远程调用</a></div><div style='float:right;width:49%'>·<a href='100165485.htm'>16.6.6 调用环境</a></div><div style='float:left;width:49%'>·<a href='100165486.htm'>16.7 小结</a></div><div style='float:right;width:49%'>·<a href='100165487.htm'>17.1 System.Globalization命名空间</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?