.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;
}
}
}
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 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;
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;
- .NET Remoting——first things first(1):抛砖引玉
- .NET Remoting——first things first(2):Channel信道
- .NET Remoting——first things first(3):RemoteObject远程对象
- .NET Remoting——first things first(4):Summary概述
- First things first
- first things first
- First things first 序章
- HCI- First Things First
- 短语:first things first
- csdn—first
- first
- first
- first
- First
- first
- first
- first
- first
- 人海搜“脸”
- 常见控件用法.
- BeanFactory与Application的区别
- DataBinder.Eval总结
- Java EE 5的SOA考验(长春JAVA培训班 吉林长春JAVA软件就业培训)
- .NET Remoting——first things first(1):抛砖引玉
- 佛学中的108条做人道理
- 线程的暂停、恢复和终止
- 值类型和引用类型的区别在哪里?
- Weblogic Server有关JDBC的配置和测试
- 深入分析ADO.NET中的DataSet对象
- .NET Remoting——first things first(2):Channel信道
- .NET Remoting——first things first(3):RemoteObject远程对象
- 魔力AJAX:在现有的网页中使用AJAX