扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:刘彦青 来源:Yesky 2007年11月14日
关键字:
csc /target:library /out:ITask.dll ITask.cs csc /target:library /out:TaskRunner.dll TaskRunner.cs csc /r:ITask.dll /r:TaskRunner.dll TaskServer.cs csc /r:ITask.dll /r:TaskRunner.dll TaskClient.cs |
[i] Task Server Started, press to exit? |
// ITask.cs // 用户可以使用该界面来创建自己的任务,它完成下面的二种操作: // ·服务器可以通过调用方法Run()来运行建立的任务。 // ·客户端可以保证任务从方法Run()中启动。 // 其中还有一个Identify()方法,服务器用它显示一些有关任务的信息。 // 该界面被编译为同一个名字空间下的单独的库文件,使得任务服务器的管理员能够将该界面作为所有能够在//他的任务服务器上运行的任务的契约进行分发。 // 客户端将继承该类,创建自己的任务对象,提交给服务器运行。 namespace TaskServer { // 必须将它定义为一个界面 public interface ITask { object Run(); string Identify(); } } // TaskRunner.cs // 该对象用来运行由客户端提交的任务,提交的任务将在服务器的应用域执行。 // TaskRunner对象以引用的方式传递给客户端,无需对它进行串行化 // TaskRunner接受所有实现ITask界面的任务,它需要二个参数:Run()和Identify()。 using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; namespace TaskServer { public class TaskRunner : MarshalByRefObject { ITask remoteTaskObject; public TaskRunner() { Console.WriteLine("\n[i] TaskRunner activated"); } public string LoadTask(ITask task) { Console.WriteLine("\n[i] Loading new task..."); if(task == null) { Console.WriteLine("[e] Task reference is NULL. Task not Loaded."); return "[e] Task not loaded."; } remoteTaskObject = task; Console.WriteLine("[i] Task has been loaded."); Console.WriteLine("[i] Task ID: " + remoteTaskObject.Identify() + "\n"); return "[i] Task loaded. Welcome to the All Powerful TaskServer."; } public object RunTask() { Console.WriteLine("\n[i] Running the task..."); object result = remoteTaskObject.Run(); Console.WriteLine("[i] Task finished."); return result; } } } // TaskServerEngine.cs // 这个类用来启动任务服务器应用程序。它建立C#远程执行的后端,加载通道,注册TaskRunner对象,然后让 //远程执行机制的后端监测TCP通道上的连接请求 using System; using System.IO; // 下面的库用于向远程执行机制注册我们的对象 using System.Runtime.Remoting; // 下面的库用于向通道服务注册我们的TCP通道设备 using System.Runtime.Remoting.Channels; // 该库提供了用来与远程应用域(客户端)通讯所需要的TCP通道 using System.Runtime.Remoting.Channels.Tcp; namespace TaskServer { public class TaskServerEngine { // 我们只需要一个方法,它可以是静态的,因为我们不需要建立这个类的实例,该方法的作用仅仅是 //创建并创始化TaskServerEngine。 public static void Main() { // 向用户表明我们正在启动服务器类 Console.WriteLine("The All Powerful Task Server!"); Console.WriteLine("....\"Your Task is My Command\"...."); Console.WriteLine("\n[i] Starting Task Server..."); try { // 创建TCP通道 Console.WriteLine("[i] -- Creating TCP channel"); TcpChannel chan = new TcpChannel(8085); // 向.NET的远程服务注册新创建的TcpChannel,使客户端可以使用这一服务 Console.WriteLine("[i] -- Registering TCP channel"); ChannelServices.RegisterChannel(chan); //向远程机制的后端注册TaskRunner对象,RegisterWellKnownServiceType方法将完成这一 //操作,并接收下面的参数: // *内容为TaskRunner对象映象的类型对象 // * 向客户公布的服务名字 // * 对象的模式:Singleton意味着所有客户端请求共享一个对象服务;SingleCall意味着 // 每个客户端请求使用一个新的对象服务。 Console.WriteLine("[i] -- Registering the TaskRunner object"); Type theType = new TaskRunner().GetType(); RemotingConfiguration.RegisterWellKnownServiceType(theType, "TaskServer", WellKnownObjectMode.Singleton); Console.WriteLine("[i] Task Server started, press Console.ReadLine(); } catch (Exception e) { Console.WriteLine("[!] An error occured while initialising the TaskServerEngine."); Console.WriteLine(e); } } } } // TaskClient.cs // 这是一个客户端应用域,客户端的任务是建立一个任务对象,并将它提交给任务服务器 using System; // 建立与任务服务器的连接所必需的库文件 using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using TaskServer; namespace HappyClientWithTask { [Serializable()] // 下面是我们创建的任务 class ClientTask : ITask { private int num1, num2; private int result; public ClientTask(int num1, int num2) { this.num1 = num1; this.num2 = num2; } public object Run() { result = num1 * num2; return (object)result; } public string Identify() { return("I am a multiplication task."); } } public class Client { public static void Main() { Console.WriteLine("\nWelcome to the humble, lowly client Application Domain.\n"); ClientTask clientTask = new ClientTask(100,100); try { Console.WriteLine("[i] Connecting to TaskServer..."); Console.WriteLine("[i] - Opening TCP Channel"); TcpChannel chan = new TcpChannel(); Console.WriteLine("[i] - Registering the channel"); ChannelServices.RegisterChannel(chan); Console.WriteLine("[i] Connected to TaskServer"); // 从TaskServer中获取TaskRunner对象的引用 // Activator类中的GetObject方法需要二个参数: // * 对象类型 // * 对象的URI位置 Console.WriteLine("[i] Getting a reference to the TaskRunner Object"); TaskRunner taskRunner = (TaskRunner)Activator.GetObject(typeof(TaskServer.TaskRunner), "tcp://localhost:8085/TaskServer"); if(taskRunner == null) { Console.WriteLine("[e] Could not locate server."); Console.WriteLine("[i] Exiting..."); return; } Console.WriteLine("[i] We have an object reference!"); // 下面我们将把任务对象传递给任务服务器 Console.WriteLine("\n[i] Submitting our task to the server..."); string response = taskRunner.LoadTask(clientTask); Console.WriteLine("[i] Server says: " + response); Console.WriteLine("\n[i] Running the task and awaiting feedback..."); object result = taskRunner.RunTask(); Console.WriteLine("[aaa-uuuum] The Great and Powerful TaskServer Says: " + (int)result); } catch (Exception e) { Console.WriteLine("[e] An exception occurred."); Console.WriteLine(e); } } } } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者