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

 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;

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值