第四节 保持这个应用程序运行
你还需要确定这个主应用程序直到你准备好时才退出,这个主应用程序一终止,你的远程对象对任何客户就变得不可用。在本例中,你保持这个应用程序运行直到用户按下回车键,但在一个实际的应用程序中,你应该选择为主应用程序生成一个 Windows 2000或 Windows NT服务应用程序,以便它始终能够运行。
首先,你需要通过点击 Project菜单引用NETserver项目,然后添加引用和项目标签(参见图 2),选择 NETServer并单击 OK,在模块 1的顶部添加一条导入语句:
导入 NETserver

这样你的类对这个主应用程序就可用了,对于那些能够创建这个对象的实例的远程系统就很关键。
主配置文件描述了你的对象以及如何到达。使用这个文件来设置主应用程序,以便它能够在适当的通道里监听适当的信息。在Solution Explorer中,右击你的主应用程序并从菜单中选择Add New Item(添加新的项目)。命名这个文件为 host.cfg。这个文件是一个简单的文本文件,使用井号(#)作为分隔符,并且它有三行代码能为你的远程对象服务。
第一行指出主应用程序的名称。名称可以是任何东西,但是客户机可以使用它来找到主机:
接下来的这行定义调用的对象,它描述了这个类的类型名称,这个类所处的集合,应该监听消息的主机的统一资源标识号(URI)以及对象运行的方式:
WellKnownObject#NETserver.NETclass#NETserver#NETserver/NETclass.soap#Singleton |
你需要在一个行中输入前面所有的代码,在项目之间不留空格。这是 beta 1中隐含的唯一的文件格式;将来,你将能使用 XML来格式化这个文件。
远程调用支持两种方式: Singleton和 SingleCall。
第三行配置当与对象通信时使用的通道。本例中使用的HTTP通道, 8085端口:
Channel#System.Runtime.Remoting#System.Runtime._ Remoting.Channels.HTTP.HTTPChannel#ports=8085
|
在一行中输入所有的代码,项目中间不留空格。
一旦你构建了解决方案,你就可以打开一个控制台窗口并运行主应用程序。以命令行形式进入 NEThost\u30446目录并执行 NEThost.exe。应用程序指出这个网络类已经被初始化了。它现在监听来自客户机的请求。
你还可以以编程方式配置主机,而不使用配置文件。配置文件很好用,因为你可以使用它来改变主应用程序使用的通道或端口而不必重编译和重新部署。然而,如果你喜欢的话,你也可以跳过配置文件而直接地从代码中配置远程服务。它的功能上与使用配置文件相当;你可以选择任一种方法。
修改Sub Main方法来配置主机:
Sub Main() Dim c As New Channels.HTTP.HTTPChannel(8085) ChannelServices.RegisterChannel(c) RemotingServices.RegisterWellKnownType("NETserver", "NETserver.NETclass","NETclass", WellKnownObjectMode.Singleton) Console.WriteLine("Press to exit") Console.Read() End Sub
|
首先,你要创建一个 HTTPChannel对象,初始化它来使用 8085端口,然后使用 ChannelServices注册这个通道。接下来,你可以注册远程对象,只要提供集合名称、完整的类名、客户机使用的 URI以及对象的存取方式。
当你使用 DCOM调用一个远程对象时,你的客户机代码与你的项目中直接调用的对象的代码不同。VB.NET并不保留这个特性,你的 VB.NET客户应用程序需要包含配置远程系统的代码以使远程对象可用的。不管对象是本地的还是远程的,调用这个对象上方法的实际代码都是相同的,但是你需要添加几行额外代码来配置这个远程系统。
在 VS.NET中创建一个新Windows应用程序项目并把它命名为 NETclient,添加一个NETserver集合的引用,并添加一个 Imports语句:
这个语句使你的客户应用程序可使用远程类,你现在可以添加一个按钮到窗体中,并写按钮的代码来调用对象:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim obj As New NETclass() MsgBox(obj.GetName("238-95-7766")) End Sub
|
最后,你需要配置远程服务。使用 NEThost应用程序中相同的代码来完成这个任务,添加一个 System.Runtime.Remoting.dll的引用并添加一句 Imports语句:
Imports System.Runtime.Remoting |
在窗体的New方法中添加一行代码来配置远程服务:
RemotingServices.ConfigureRemoting("...cfg") |
与主应用程序一样,你需要创建一个配置文件以便客户应用程序知道如何定位和联络主应用程序和你的远程对象。
这个配置文件也是一个简单的文本文件,就象主机配置文件。它也包含三行代码,使用井号(#)作为分隔符。第一行代码标识客户程序名称:
下面的这行代码标识你的远程对象集合:
Assembly#NETserver#NEThost#NETserver.NETclass=HTTP://localhost:8085/NETclass |
在一行中输入所有的代码,项目中间不留空格。
你需要指定远程主应用程序的应用程序名和包含这个远程对象的集合的名称。然后提供这个远程类的完整类名和用户将访问的类的完整的URI。从你在主机配置文件中指定的 URI中得到这个 URI,并且指定通信协议(HTTP://)、主机(localhost)和端口(:8085)。
最后,你需要指出与主应用程序通信时使用的通道,这是你包含在主机配置文件中的相同的一行代码:
Channel#System.Runtime.Remoting#System.Runtime.Remoting.Channels.HTTP.HTTPChannel |
在一行中输入所有的代码,项目中间不留空格。你必须在客户机和主机之间使用公共的通道;否则,它们就不能够通信。