先简要地讨论远程对象和一个简单的客户机/服务器应用程序,该程序使用了远程对象。执行的远程对象是hello。 helloservers是服务器上应用程序的主类,helloclient是客户上应用程序的主类,如下图所示:
第一步:创建远程的共享库
为了说明.net remoting 是如何运行的,先创建一个简单的类库,以创建远程的对象。
依次点击“文件”->“新创建”->“工程”,选择创建一个c# library,并将其命名为remotehello,然后点击ok按钮。这将创建一个.net remote客户端和服务器端用来通讯的“共享命令集”。
程序集的名称是remotehello.dll,类的名称是hello, 类hello是从
system.marshallbyrefobject 派生出来的。
程序集的完整代码 hello.cs为:
using system;
namespace wrox.procsharp.remoting
{
/// <summary>
/// class1 的摘要说明。
/// </summary>
public class hello : system.marshalbyrefobject
{
public hello()
{
//
// todo: 在此处添加构造函数逻辑
//
console.writeline(“constructor called”);
}
~hello()
{
console.writeline(“destructor called”);
}
public string greeting(string name)
{
console.writeline(“greeting called”);
return “hello,” + name;
}
}
}
编译创建的工程,就会得到一个dll文件,并可以在其他的工程中使用它。
第二步:创建简单的服务器
创建一个c#控制台应用程序helloserver 。 为了使用tcpserverchannel类,必须引用
system.runtime.remoting程序集,另外更重要的是,引用上面创建的remotehello程序集。
在main()方法中,用端口号8086创建一个 system.runtime.channels.tcp信道,该信道
使用system.runtiem.remoting.channels.channelservices注册,使之用于远程对象。
在远程对象注册之后,使服务器一直处于运行状态,直到按任意键为止:
helloserver.cs的完整代码为:
using system;
using system.runtime.remoting;
using system.runtime.remoting.channels;
using system.runtime.remoting.channels.tcp;
namespace wrox.procharp.remoting
{
public class helloserver
{
[stathread]
public static void main(string[] args)
{
tcpserverchannel channel = new tcpserverchannel(8086);
channelservices.registerchanel(channel);
remotingconfiguration.registerwellknownservicetype( typeof(hello),”hi”,
wellknownobjectmode.singlecall);
system.console.writeline(“hit to exit”);
system.console.readline();
}
}
}
名字空间是对象所需要的。请记住,如果得到system.runtime.remoting.channels.tcp名字空间不存在的信息,请检查是否象上面的代码那样添加了对system.runtime.remoting.dll的引用。
第三步: 创建简单的客户机
客户机也是一个c#控制台应用程序 helloclient. 这里也引用了system.runtime.remoting
程序集,以便使用tcpclientchannel类。 此外,也必须引用remotehello程序集。
在客户机程序中,要创建一个tcpclientchannel对象,这个对象注册在channelservices 中。
对于tcpchannel,使用默认的构造函数,因此可以选择任意一个端口。接下来使用activator类把代理对象返回给远程对象。
helloclient.cs 的完整代码为:
using system;
using system.runtime.remoting.channels;
using system.runtime.remoting.channels.tcp;
namespace wrox.procsharp.remoting
{
/// <summary>
/// helloclient 的摘要说明。
/// </summary>
public class helloclient
{
[stathread]
public static void main(string[] args)
{
channelservices.registerchannel(new tcpclientchannel());
hello obj = (hello)activator.getobject(typeof(hello),”tcp://localhost:8086/hi”);
if (obj == null)
{
console.writeline(“could not locate server”);
return;
}
for(int i=0;i<5; i++)
{
console.writeline(obj.greeting(“christian”));
}
}
}
}
当打开服务器和客户机程序hello时,christian在客户控制中会出现5次。在服务器应用程序的控制台窗口中,会看到类似的下图的窗口输出结果