4-23 https://www.cnblogs.com/zhengyun_ustc/archive/2006/06/09/remoting_InvalidCredentialException.html

今天看了一篇C# Remoting的一个简单例子,博主简单的介绍了remoting,目前所开发的系统也用到了remoting,特意重温了下系统,发觉其实也就那么回事情,服务器端定义远程对象,配置配置文件,客户端调用远程对象,其实也没有那么高大上(可能本人还未理解其中精髓)。

先展示代码,再说明这其中的机制(以C# Remoting的一个简单例子为基础)

1 创建RemoteSample项目,将其编译成lib文件。

在这个项目中创建三个接口(RemoteArrayInterface,RemoteStringInterface,RemoteCacuteInterface,这三个接口有不同的用途,分别处理字符串、数组、计算。

1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace RemoteSample
{
  public  interface RemoteArrayInterface
    {
      int SumArray(int[] a);
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace RemoteSample
{
  public  interface RemoteCalcuteInterface
    {
         int sum(int a, int b);
    }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace RemoteSample
{
  public  interface RemoteStringInterface
    {
     string CombineString(string str1, string str2);
    }
}

 2,  server端

1)创建一个远程类,继承MarshalByRefObject,实现上面的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RemoteSample;
namespace RemoteSampleServer
{
    public class RemoteObject : MarshalByRefObject,RemoteArrayInterface,RemoteCalcuteInterface,RemoteStringInterface
    {
        public RemoteObject()
        {
            Console.WriteLine("New Reference Added");
        }
        public int sum(int a, int b)
        {
            return a + b;
        }
        public  int SumArray(int[] array)
        {
            int sum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }
            return sum;
        }
      public string CombineString(string str1, string str2)
      {
          return  str1 + " is not equal " + str2;
      }
    }
}

  

2)server主体部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RemoteSample;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteSampleServer
{
    class RemoteServer
    {
        static void Main(string[] args)
        {
            try
            {
                TcpServerChannel tcpserverchannel = new TcpServerChannel(8888);
                ChannelServices.RegisterChannel(tcpserverchannel,false);
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "RemoteObject", WellKnownObjectMode.SingleCall);
                Console.WriteLine("press any key");
                Console.ReadKey();
            }
            catch(Exception e)
            {
                Console.WriteLine(e.ToString());
            }
 
        }
    }
}

 原博客中注册信道只用了一个参数,该方法已经废弃了,这里有两个参数,如果启用安群,第二个参数设置为true,否则设置为false,如果设置为false,将不会使在tcp或Ipc信道上所做的安全设置无效。

这里采用了服务器端激活(Wellknow),使用singlecall方式。

 3  客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RemoteSample;
namespace RemoteSampleClient
{
    class RemoteClient
    {
        static void Main(string[] args)
        {
            RemoteCalcuteInterface calcuteRemote = (RemoteSample.RemoteCalcuteInterface)Activator.GetObject(typeof(RemoteSample.RemoteCalcuteInterface), "tcp://localhost:8888/RemoteObject");
            Console.WriteLine("a +b = {0}", calcuteRemote.sum(1, 5).ToString());
            RemoteStringInterface stringRemote = (RemoteSample.RemoteStringInterface)Activator.GetObject(typeof(RemoteSample.RemoteStringInterface), "tcp://localhost:8888/RemoteObject");
            Console.WriteLine(" {0}", stringRemote.CombineString("wei xiao bao","kang xi"));
            int[] array = new int[4] { 1, 3, 4, 5 };
            RemoteArrayInterface arrayRemote = (RemoteSample.RemoteArrayInterface)Activator.GetObject(typeof(RemoteSample.RemoteArrayInterface), "tcp://localhost:8888/RemoteObject");
            Console.WriteLine("The sum is  {0}", arrayRemote.SumArray(array));      
            Console.ReadKey();
        }
    }
}

  原来客户端要注册信道,貌似不用注册信道,也能正常运行,不知道是啥原因。

个人理解:服务器端可以定义多种服务,将每种类型的服务设计成为借口,定义一个远程对象实现这些服务。客户端按需使用,要哪种类型的就通过activation获取。

这里很多信息在代码当中设置,在实际项目中,这样做肯定是不好的。目前我所接触的系统是通过配置文件设置,配置文件的好处的不需要修改代码,不需要编译。

一些概念性的知识,可以查阅百度百科。

C# Remoting例子的更多相关文章

  1. .net remoting(1)简单例子

    1.例子(程序间的通讯) class Program { static void Main(string[] args) { HttpChannel _channel = ); ChannelServ ...

  2. C# Remoting的一个简单例子

    .Net对于远程调用提供了两种方法:Remoting和WebService.WebService现在是如火如荼,特别是有一种比较流行的架构:Winform+WebService(Java..Net), ...

  3. 【DWR系列01】-DWR简介及入门例子

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  4. .Net中Remoting通信机制简单实例

    .Net中Remoting通信机制 前言: 本程序例子实现一个简单的Remoting通信案例 本程序采用语言:c# 编译工具:vs2013工程文件 编译环境:.net 4.0 程序模块: Test测试 ...

  5. .Net中Remoting通信机制

    Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式. 从微软的产品角度 ...

  6. WCF分布式开发必备知识(2):.Net Remoting

    .Net Remoting技术,我们可以将其看作是一种分布式处理方式.作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程 ...

  7. .NET Remoting原理及应用实例:

    Remoting:(本文摘自百度百科) 简介:        什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方 式.从微软的产品角度来看,可以说Remoting就是DCOM的一种升 ...

  8. .NET Remoting学习笔记(二)激活方式

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科  ♂风车车.Net 激活方式概念 在 ...

  9. spring源码分析之spring-web remoting模块概况及基本概念

    spring-web总体分为三部分:caucho.httpinvoker.jaxws,其总体构造图如下: uml结构: 先看看网上搜索到的上述实现的原理吧:Spring RMI,Hessian/Bur ...

随机推荐

  1. JavaScript数组删除指定元素

    ^_^ function arrayRemoveItem(arr, delVal) { if (arr instanceof Array) { var index = arr.indexOf(delV ...

  2. springboot-thymeleaf

    Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: Thymeleaf 在有网络和无网络 ...

  3. timer计算两个方法执行时间

    >>> from timeit import Timer >>> Timer("temp = x; x = y; y = temp", &quo ...

  4. window alias给cmd命令起别名

    场景: Linux的alias命令是个非常实用的工具,任何命令通过alias可以精简到很短,比如:alias l='ls -l' Windows也有alias类似的命令,就是:doskey,开启方法也 ...

  5. gitlab服务器IP调整后修改domian或ip

    背景 本地搭建的gitlab 服务器,在 /etc/gitlab/gitlab.rb 中 external_url 通常是局域网ip的形式.如下所示 external_url 'http://192. ...

  6. vs2013在使用ef6时,创建模型向导过程中,四种模型方式缺少2种

    下载eftool,并安装 https://download.microsoft.com/download/2/C/F/2CF7AFAB-4068-4DAB-88C6-CEFD770FAECD/EFTo ...

  7. 浏览器打开exe文件

    <win-r> regedit 打开注册表,然后自定义协议 自定义协议注册表.reg 打开后导入 Windows Registry Editor Version 5.00 [HKEY_CL ...

  8. hibernate09--连接查询

    创建实体类 package cn.bdqn.bean; import java.util.ArrayList; import java.util.Date; import java.util.List ...

  9. java学习之路--多线程实现的方法

    1 继承Thread类 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Th ...

  10. 线程同步-使用SimaphoreSlim类

    SimaphoreSlim类是作为Semaphore类的轻量级版本的.该类限制了同时访问同一个资源的线程数量. 代码Demo: using System;using System.Threading; ...