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

来源:互联网 发布:淘宝信誉排行榜 编辑:程序博客网 时间:2024/06/05 00:22
 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;

 

 
原创粉丝点击