zoukankan      html  css  js  c++  java
  • .Net Remoting 对象生存周期(3)

    MS .Net Remoting框架是完全可配置的,可由配置文件定制Remoting的各种行为,下面讨论下SAOs(服务器端可激活对象的配置)的配置文件,租约与CAOs(客户端可激活对象),在实际汲及Remoting的项目中,推荐使用配置文件,这样可以简化代码,随时更改,通道,端口,URL的设置而不用重新编译程序,接下来,我们在上一个Demo的基础上,改为配置文件实现一个简单的Remoting程序

    首先,看一下SAOs配置文件:
     1<?xml version="1.0" encoding="utf-8" ?>
     2
     3<configuration>
     4  <system.runtime.remoting><!--所有关于Remoting的配置,可据此在MSDN中查到Remoting的所有配置节点-->
     5    <application>
     6      <service><!--注册一个服务-->
     7        <wellknown mode="Singleton" objectUrl="SsyHello" type="General.HelloServer,General"/><!--注册一个众所周知的对象,及其它各种信息-->
     8      </service>
     9      <channels><!--注册通道 -->
    10        <channel port="8086" ref="http"/><!--ref指引用machine.config中的配置-->
    11      </channels>
    12    </application>
    13  </system.runtime.remoting>
    14</configuration>

    此时在对于Demo1中的Server端代码如下:
     1using System;
     2using System.Collections.Generic;
     3using System.Text;
     4using System.Runtime.Remoting.Channels;
     5using System.Runtime.Remoting;
     6using System.Runtime.Remoting.Channels.Tcp;
     7using System.Runtime.Remoting.Channels.Http;
     8using General;
     9namespace Server
    10{
    11   public class Server
    12    {
    13       /// <summary>
    14       /// 第二步,创建服务器端
    15       /// </summary>
    16       /// <param name="args"></param>
    17       /// <returns></returns>

    18        static int Main(string[] args)
    19        {
    20            ////Remoting内置的两种通道,也可自定义自己的通道
    21            //TcpChannel tcpChannel = new TcpChannel(8085);//tcp通道
    22            //HttpChannel httpChannel = new HttpChannel(8086);//http通道
    23
    24
    25            ////服务器端对通道进行注册,注册完后,服务器就对通道进行监听
    26            //ChannelServices.RegisterChannel(tcpChannel,false);
    27            //ChannelServices.RegisterChannel(httpChannel,false);
    28
    29            ////把远程对象注册到服务器上,注册众所周知的服务类型,WellKnown---都是服务器激活的对象
    30            //RemotingConfiguration.RegisterWellKnownServiceType(typeof(HelloServer),"SayHello",WellKnownObjectMode.Singleton);
    31            ///*
    32            // * Singleton 服务器端只产生单例,任何请求共用,保存状态,
    33            // * Singlecall 客户端一个请求对应一个实例,没有状态
    34            // * 
    35            // * 
    36            // * 
    37            // * 
    38            //*/
    39            string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;//得到APP.confg文件在程序可执行目录下生成的server.exe.config文件的路径
    40            RemotingConfiguration.Configure(path);
    41            Console.Write("服务器开始监听,按任意銉退出");
    42            Console.ReadLine();
    43            return 0;
    44        }

    45    }

    46}

    47

    从以上可以看出,通道的定义,注册及对象在服务器上的注册等环节均用配置文件实现了,同理对于客户端如下:
    配置文件:
     1<?xml version="1.0" encoding="utf-8" ?>
     2<configuration>
     3  <system.runtime.remoting>
     4    <system.runtime.remoting>
     5      <application>
     6        <client>
     7          <wellknown url="http://localhost:8086/SayHello"  type="General.HelloServer,General"/>
     8        </client>
     9        <channels>
    10          <channel port="0" ref="http"/>
    11        </channels>
    12      </application>
    13    </system.runtime.remoting>
    14  </system.runtime.remoting>
    15</configuration>

    客户端代码为:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Runtime.Remoting.Channels.Http;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting;
    using General;
    namespace Client
    {
        
    class Client
        
    {
            
    /// <summary>
            
    /// 第三步,创建客户端
            
    /// </summary>
            
    /// <param name="args"></param>

           public static void Main(string[] args)
            
    {
                
    ////使用TCP通道得到远程对象代理,不用监听
                //TcpChannel tcpChannel1 = new TcpChannel();
                
    //ChannelServices.RegisterChannel(tcpChannel1,false);
                
    //HelloServer helloServer1 = (HelloServer)Activator.GetObject(typeof(General.HelloServer), "tcp://localhost:8085/SayHello");
                
    //if (helloServer1 == null)
                
    //{
                
    //    Console.Write("Could not locate TCP server");
                
    //}


                
    ////使用HTTP通道得到远程对象代理,不用监听
                //HttpChannel httpChannel2 = new HttpChannel();
                
    //ChannelServices.RegisterChannel(httpChannel2, false);
                
    //HelloServer helloServer2 = (HelloServer)Activator.GetObject(typeof(General.HelloServer), "http://localhost:8086/SayHello");
                
    //if (helloServer2 == null)
                
    //{
                
    //    Console.Write("Could not locate HTTP server");
                
    //}
                RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
                HelloServer helloServer2 
    = new HelloServer();
               
    //一般方法调用
                
    //Console.WriteLine("TCP HelloMethod {0}", helloServer1.HelloMethod("TcpChannel"));
                Console.WriteLine("HTTP HelloMethod {0}", helloServer2.HelloMethod("HTTPChannel"));

               
    //传递自定义类型参数
               
    // Console.WriteLine("TCP HelloMethod {0}", helloServer1.HelloUserMethod(new User("wumaosheng",false)));
                Console.WriteLine("http HelloMethod {0}", helloServer2.HelloUserMethod(new User("heqichang"true)));


                
    //测试SingleTon和SingleCall,多次调用
                int count;
                
    //Console.WriteLine("TCP HelloMethod {0} count:{1}", helloServer1.HellTonOrCall("mswu",out count),count);
                Console.WriteLine("http HelloMethod {0} count:{1}", helloServer2.HellTonOrCall("mswu"out count), count);
                Console.WriteLine(
    "http HelloMethod {0} count:{1}", helloServer2.HellTonOrCall("mswu"out count), count);

                Console.ReadLine();
            }

        }

    }


    远程对象及其它部分均不需改变,未完,待续....

  • 相关阅读:
    sort-list leetcode C++
    sum-root-to-leaf-numbers leetcode C++
    sum-root-to-leaf-numbers leetcode C++
    path-sum-ii leetcode C++
    path-sum-ii leetcode C++
    0139 函数的两种声明方式
    0138 函数可以调用另外一个函数
    0137 函数案例:数组翻转、冒泡排序、判断闰年
    0136 JavaScript中 arguments 的使用
    0135 函数的返回值:return 语句、终止函数 、只能返回一个值、没有 return 返回 undefined、break &continue&return 的区别
  • 原文地址:https://www.cnblogs.com/mshwu/p/772708.html
Copyright © 2011-2022 走看看