四、程序代码
创建类库项目SysInfoServer,其中设计了可远程类型SysInfo类,它继承了MarshalByRefObject类型,其方法主要完成对远程主机的信息读取。其信息包括了机器名称、版本号、用户名、用户所在域、系统目录等。实现的代码如下:
using System;
using System.Collections;
namespace SysInfoServer
{
/// <summary>
/// 摘要说明。
/// </summary>
public class SysInfo:MarshalByRefObject
{
public string GetCurrentTime()
{
return DateTime.Now.ToLongTimeString();
}
public string GetWorkingSet()
{
return Environment.WorkingSet.ToString();
}
public string GetVersion()
{
return Environment.Version.ToString();
}
public string GetUserName()
{
return Environment.UserName;
}
public string GetUserDomainName()
{
return Environment.UserDomainName;
}
public string GetSystemDirectory()
{
return Environment.CurrentDirectory;
}
public string GetMachineName()
{
return Environment.MachineName;
}
public string GetCurrentDirectory()
{
return Environment.CurrentDirectory;
}
public string GetOSVersion()
{
return Environment.OSVersion.ToString();
}
}
}
编译类库项目,生成SysInfoServer.dll库文件。
创建基于控制台的服务器端项目RemotingServer。在引用里添加System.Runtime.Remoting和刚编译好的SysInfoServer.dll库文件。编写相应代码如下:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using SysInfoServer;
class MyApp
{
static void Main()
{
//创建TCP信道
TcpServerChannel channel=new TcpServerChannel(10001);
//注册信道
ChannelServices.RegisterChannel(channel,false);
//注册远程对象类型
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SysInfo), "SysInfo", WellKnownObjectMode.SingleCall);
Console.WriteLine("远程服务器正在运行中,按Enter键退出");
Console.ReadLine ();
}
}
编译项目,生成RemotingServer.exe可执行文件。
创建基于控制台或Windows窗体的客户端端项目RemotingClient。在引用里添加System.Runtime.Remoting和刚编译好的SysInfoServer.dll库文件。编写相应代码如下:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using SysInfoServer;
namespace TimeClient
{
class MyApp
{
static void Main(string[] args)
{
//创建TCP信道
TcpClientChannel channel=new TcpClientChannel();
//注册信道
ChannelServices.RegisterChannel(channel, false);
try
{
//获取远程对象
RemotingConfiguration.RegisterWellKnownClientType(typeof(SysInfo), "tcp://localhost:10001/SysInfo");
SysInfo info = new SysInfo();
Console.WriteLine("远程系统信息列表");
Console.WriteLine("机器名称:" + info.GetMachineName());
Console.WriteLine("版本号:" + info.GetVersion());
Console.WriteLine("用户名:" + info.GetUserName());
Console.WriteLine("用户所在域:" + info.GetUserDomainName());
Console.WriteLine("系统目录:" + info.GetSystemDirectory());
Console.WriteLine("当前目录:" + info.GetCurrentDirectory());
Console.WriteLine("系统版本:" + info.GetOSVersion());
Console.WriteLine("当前时间:" + info.GetCurrentTime());
Console.ReadLine();
}
catch
{
Console.WriteLine("发生错误了!");
}
}
}
}
编译项目,生成RemotingClient.exe执行文件。
五、结语
本文通过远程主机信息获取程序并介绍了.NET Remoting程序设计的基本思路与框架。当前很多企业级服务都是基于 .NET 远程处理基础结构构建的,它不仅可以提供 COM+ 分布式对象模型所具备的所有丰富性和灵活性,而且包括支持大范围分布式事务。笔者希望在此能抛砖引玉,使读者通过了解本程序框架的基础上并做一些必要修改(比如可远程类型设计的修改)开发出更加功能强大的应用。
|