您的位置:首页 > 其它

.NET Remoting——first things first(1):抛砖引玉

2008-04-07 11:52 204 查看
 Microsoft® .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这种框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输之前,对其进行编码和解码。应用程序可以在注重性能的场合使用二进制编码,在需要与其他远程处理框架进行交互的场合使用 XML 编码。在从一个应用程序域向另一个应用程序域传输消息时,所有的 XML 编码都使用 SOAP 协议。出于安全性方面的考虑,远程处理提供了大量挂钩,使得在消息流通过通道进行传输之前,安全接收器能够访问消息和序列化流。
         通常,如果没有底层框架的支持,管理远程对象的生存期会非常麻烦。.NET Remoting 提供了许多可供选择的生存期模型,这些模型分为两个类别:

 客户端激活对象

        客户端激活对象受基于租用的生存期管理器的控制,这种管理器确保了租用期满时对象可被回收。

 服务器激活对象

         对于服务器激活对象,开发人员则可以选择“单一调用”模式或“单一元素”模式。

 

 
案例介绍:
        客户端调用在服务器注册的远程对象Calculate,获得对象后,使用Calulate方法。

 远程对象


using System;


using System.Collections.Generic;


using System.Text;




namespace Inovout.Remoting.RemotingObject






{




    /**//// <summary>


    /// 算术运算


    /// </summary>


    public class Calculator : MarshalByRefObject




    

{




        /**//// <summary>


        /// 加法


        /// </summary>


        /// <param name="addend">加数</param>


        /// <param name="augend">被加数</param>


        /// <returns>加法结果</returns>


        public double Addition(double addend, double augend)




        

{


            return addend + augend;


        }






        /**//// <summary>


        /// 减法


        /// </summary>


        /// <param name="subtrahend">减数</param>


        /// <param name="minuend">被减数</param>


        /// <returns>减法结果</returns>


        public double Subtration(double subtrahend, double minuend)




        

{


            return subtrahend - minuend;


        }






        /**//// <summary>


        /// 乘法


        /// </summary>


        /// <param name="multiplicator">乘数</param>


        /// <param name="faciend"><被乘法/param>


        /// <returns>乘法结果</returns>


        public double Multiplication(double multiplicator, double faciend)




        

{


            return multiplicator * faciend;


        }






        /**//// <summary>


        /// 除法


        /// </summary>


        /// <param name="divisor">除数</param>


        /// <param name="dividend">被除数</param>


        /// <returns>除法结果</returns>


        public double Division(double divisor, double dividend)




        

{


            return divisor / dividend;


        }


    }


}
 

服务器端


            //创建信道


            processResultTextBox.Text += "开始创建信道。" + Environment.NewLine;


            TcpChannel serverChannel = new TcpChannel(8891);


            processResultTextBox.Text += "创建信道成功。" + Environment.NewLine;




            //注册信道


            processResultTextBox.Text += "开始注册信道。" + Environment.NewLine;


            ChannelServices.RegisterChannel(serverChannel, true);


            processResultTextBox.Text += "注册信道成功。" + Environment.NewLine;


            


            //注册远程对象


            processResultTextBox.Text += "开始创建远程对象。" + Environment.NewLine;


            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator),


                "CalculatorService", WellKnownObjectMode.Singleton);


            processResultTextBox.Text += "创建远程对象成功。" + Environment.NewLine;
 


 客户端


            //创建信道


            processResultTextBox.Text += "开始创建信道。" + Environment.NewLine;


            TcpChannel clientChannel = new TcpChannel();


            processResultTextBox.Text += "创建信道成功。" + Environment.NewLine;




            //注册信道


            processResultTextBox.Text += "开始注册信道。" + Environment.NewLine;


            ChannelServices.RegisterChannel(clientChannel, true);


            processResultTextBox.Text += "注册信道成功。" + Environment.NewLine;


            


            //获取远程对象


            processResultTextBox.Text += "开始获取远程对象。" + Environment.NewLine;


            Calculator calculator = (Calculator)Activator.GetObject(


                  typeof(Calculator), "tcp://localhost:8891/CalculatorService");


            processResultTextBox.Text += "获取远程对象成功" + Environment.NewLine;




            //使用对象


            processResultTextBox.Text += "开始使用远程对象。" + Environment.NewLine;


            double firstNumber = double.Parse(firstNumberTextBox.Text.Trim());


            double secondNumber = double.Parse(secondNumberTextBox.Text.Trim());


            double result = 0;


            switch (functorComboBox.SelectedIndex)




            

{


                case 0:


                    result = calculator.Addition(firstNumber,secondNumber);


                    break;


                case 1:


                    result = calculator.Division(firstNumber,secondNumber);


                    break;


                case 2:


                    result = calculator.Multiplication(firstNumber,secondNumber);


                    break;


                case 3:


                    result = calculator.Addition(firstNumber,secondNumber);


                    break;


            }


            processResultTextBox.Text += "远程对象完成计算。" + Environment.NewLine;


            resultTextBox.Text = result.ToString();


            processResultTextBox.Text += "远程对象计算已经输出成功。" + Environment.NewLine;




            //注销信道


            processResultTextBox.Text += "开始注销信道。" + Environment.NewLine;


            ChannelServices.UnregisterChannel(clientChannel);


            processResultTextBox.Text += "注销信道成功。" + Environment.NewLine;



 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息