Webcast.NET Remoting学习笔记(3)对象激活

转载 2013年12月04日 09:56:36

Webcast.NET Remoting学习笔记(3)对象激活

http://www.cnblogs.com/stuhrbeu/archive/2007/02/03/638761.html

        在访问一个远程对象的实例之前,我们必须激活它进行创建和初始化,对于按引用列集这里有两种激活方式:服务器激活和客户端激活。按值列集不需要专门的激活方式,它是通过序列化得到的对象的副本,实际上是通过逆序列化实现激活的。下面主要介绍服务器和客户端两种激活方式。
        我们将服务器激活类型称为well-know对象类型,因为服务器在激活对象实例之前会在一个众所周知的同一资源标识符上发布这个类型,并把他配置为一个众所周知的对象,并在特定的端点和地址发布对象。remoting提供两种激活模式:
        1 singleton
        任何时候只有一个类型实例处于活动状态,客户端首次访问时将它激活,以后的访问都由它处理,不管同一客户端还是不同客户端。
         2 singlecall
         每一次的调用方法都激活一个新的实例。支持一种无状态编程模式。 下面一个例子来看一下它们的不同
创建远程服对象
using System;
using System.Collections.Generic;
using System.Text;

namespace RemotingSamples
{
    public class HelloServer : MarshalByRefObject
    {
        public int callCounter = 0;
        public HelloServer()
        {
            Console.WriteLine("HelloServer activated");
        }

        public String HelloMethod(String name,
            out int counter)
        {
            counter = ++callCounter;
            Console.WriteLine(
                "Server Hello.HelloMethod : {0} Counter :{1}",
                name, callCounter);
            return "Hi there " + name;
        }

    }

}
创建服务器端控制台项目
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;

namespace RemotingSamples 
{

    public class Server
    {
        public static int Main(string [] args) 
        {

            TcpChannel chan1 = new TcpChannel(8085);
            HttpChannel chan2 = new HttpChannel(8086);

            ChannelServices.RegisterChannel(chan1);
            ChannelServices.RegisterChannel(chan2);


            RemotingConfiguration.RegisterWellKnownServiceType
                (
                typeof(HelloServer),
                "SayHello",
                WellKnownObjectMode.SingleCall
                );
            

            System.Console.WriteLine("Press Enter key to exit");
            System.Console.ReadLine();
            return 0;
        }


    }

}
创建客户端控制台项目
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.IO;

namespace RemotingSamples 
{
    public class Client
    {
        public static void Main(string[] args)
        {
            //使用TCP通道得到远程对象
            TcpChannel chan1 = new TcpChannel();
            ChannelServices.RegisterChannel(chan1);
            HelloServer obj1 = (HelloServer)Activator.GetObject(
                typeof(RemotingSamples.HelloServer),
                "tcp://localhost:8085/SayHello");
            if (obj1 == null)
            {
                System.Console.WriteLine(
                    "Could not locate TCP server");
            }

            //使用HTTP通道得到远程对象
            HttpChannel chan2 = new HttpChannel();
            ChannelServices.RegisterChannel(chan2);
            HelloServer obj2 = (HelloServer)Activator.GetObject(
                typeof(RemotingSamples.HelloServer),
                "http://localhost:8086/SayHello");
            if (obj2 == null)
            {
                System.Console.WriteLine(
                    "Could not locate HTTP server");
            }

            //多次调用
            int counter;
            Console.WriteLine(
                "Client1 TCP HelloMethod {0} Counter {1}",
                obj1.HelloMethod("Caveman1", out counter),
                counter);
            Console.WriteLine(
                "Client2 HTTP HelloMethod {0} Counter {1}",
                obj2.HelloMethod("Caveman2", out counter),
                counter);
            Console.WriteLine(
                "Client2 HTTP HelloMethod {0} Counter {1}",
                obj2.HelloMethod("Caveman3", out counter),
                counter);
            Console.ReadLine();
        }


    }

}
这时是singlecall运行后显示
Client1 TCP HelloMethod Hi there Caveman1 Counter 1
Client1 HTTP HelloMethod Hi there Caveman2 Counter 1
Client1 HTTP HelloMethod Hi there Caveman3 Counter 1
所以每一次都是创建了一个新实例,然后我们把singlecall改为singleton结果变为
Client1 TCP HelloMethod Hi there Caveman1 Counter 1
Client1 HTTP HelloMethod Hi there Caveman2 Counter 2
Client1 HTTP HelloMethod Hi there Caveman3 Counter 3
可见在第一次激活一个实例后客户端的请求都是他来处理。 
而客户端激活是服务器为每一个访问远程对象的客户端建立一个对象的实例,在每个实例的租约到期之前并且在被垃圾回收器回收之前每一个实例都处于激活的状态。这样就可以实现保存客户端的状态

深度学习Deep Learning(03):权重初始化问题1_Sigmoid\tanh\Softsign激励函数

二、权重初始化问题1_Sigmoid\tanh\Softsign激励函数 github地址:https://github.com/lawlite19/DeepLearning_Python 1、说明 ...
  • u013082989
  • u013082989
  • 2016年12月20日 22:42
  • 2852

激光雷达学习笔记(三)特征提取

原文出处:http://blog.csdn.net/renshengrumenglibing/article/details/8604245 激光雷达获取的信息是和周围物体之间的距离...
  • AnonymousRookie
  • AnonymousRookie
  • 2015年06月15日 20:46
  • 2286

JSP九大内置对象与Servlet学习笔记

JSP九大内置对象用途、作用域、生命周期、常用方法、重点知识总结,JSP与Servlet关系心得笔记,望各位大神提出宝贵意见。...
  • zhangliangzi
  • zhangliangzi
  • 2015年11月21日 16:04
  • 4885

Spring.NET学习笔记20——整合Remoting(应用篇)的例子

  • 2009年11月19日 14:16
  • 832KB
  • 下载

Spring.NET学习笔记20——整合Remoting(应用篇)

Spring.Services命名空间的目的是为业务服务提供位置的透明性。我们相信使用普通的接口和.NET类,用户应该可以用最简单的方式实现服务。我们也认为在将某个服务发布给客户端的时,应该只关心服务...
  • zhangxian_engineer
  • zhangxian_engineer
  • 2011年04月10日 20:11
  • 472

最容易学的ADO.NET常用对象详解(头发乱了的学习笔记 - 博客园--转载)

  • 2008年07月02日 09:29
  • 547KB
  • 下载

.Net学习笔记6-C#面向对象基础3 继承多态

1.继承(inherit)//C#为单继承 C#中一个类可以“继承”自其他类,如果A继承自B,则A叫做B的子类,B叫做A的父类(基类)。 子类会从父类继承所有非private成员、方法。子类还可以有子...
  • FateAing
  • FateAing
  • 2017年12月23日 23:14
  • 31

ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转]

说明  ObjectContext提供了管理数据的功能  Context操作数据   AddObject 添加实体 将实体添加到集合中, 创建实体时,状态为EntityState.Detached 当...
  • ligongruangao
  • ligongruangao
  • 2011年05月25日 20:29
  • 2826

.Net Remoting(分离服务程序实现) - Part.3

分离服务程序集元信息和实现 在上面Remoting基本操作的范例中,我们发现了这样一个情况:即是 客户应用程序 仍然需要引用 服务程序集(ServerAssembly),因为它需要DemoCla...
  • daihongshu
  • daihongshu
  • 2014年07月11日 16:55
  • 256

Spring.NET学习笔记4——对象的创建(基础篇)

学过了前面的课程,我们来一起学习Spring.NET的IoC容器对象的创建。  创建对象一般有3种方式:1.构造器创建,2.静态工厂创建,3.实例工厂创建  多数情况下,容器会根据对象定义中的type...
  • hliq5399
  • hliq5399
  • 2011年03月26日 20:45
  • 1118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Webcast.NET Remoting学习笔记(3)对象激活
举报原因:
原因补充:

(最多只允许输入30个字)