博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NET Remoting 示例
阅读量:4611 次
发布时间:2019-06-09

本文共 2585 字,大约阅读时间需要 8 分钟。

 

 

    .NET Remoting是.NET平台上允许存在于不同应用程序域中的对象相互知晓对方并进行通讯的基础设施。调用对象被称为客户端,而被调用对象则被称为服务器或者服务器对象。简而言之,它就是.NET平台上实现分布式对象系统的框架。只要是跨越AppDomain的访问,都属于Remoting。Remoting编程基本原理:当客户端创建远程RemotableClass的一个实例,.NET框架在客户端应用程序域中产生一个代理。该代理看起来就像实际对象。代理收到调用后,通过通道连接到远程的对象。

Remoting通过通道(channel)来传输消息。Remoting的通道主要有两种:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定义了IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。

TcpChannel类型放在名字空间System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。HttpChannel类型放在名字空间System.Runtime.Remoting.Channel.Http中。它提供了一种使用Http协议,使其能在Internet上穿越传输序列化消息流。默认情况下,HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性。通常在局域网内,我们更多地使用TcpChannel;如果要穿越防火墙,则使用HttpChannel。

 

 

 

 

 

 

我自己写了一个示例,工程结构如下:

 

1,创建一个类库,用来创建我们需要的接口

 

namespace RemotingInterface{    public interface MyInterface { string Greeting(string sName); } }

 

 

2,创建接口的实现,需要添加上面工程的引用

namespace RemotingImp{    public class MyClass : MarshalByRefObject, MyInterface    {        #region MyInterface 成员        public string Greeting(string sName)        {            return "Hello!" + sName;        }        #endregion    }}

3, 服务器端实现,需要添加上面两个的引用

namespace RemotingSever{    class Program    {        static void Main(string[] args)        {            TcpChannel channel = new TcpChannel(8080);            ChannelServices.RegisterChannel(channel, false);            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingImp.MyClass), "RemotingPersonService", WellKnownObjectMode.SingleCall);            System.Console.WriteLine("Server:Press Enter key to exit");            System.Console.ReadLine();            }    }}

 

4,客户端,需要添加接口所在的类库

namespace RemotingClient{    class Program    {        static void Main(string[] args)        {            TcpChannel channel = new TcpChannel();            ChannelServices.RegisterChannel(channel, false);            MyInterface obj = (MyInterface)Activator.GetObject(typeof(RemotingInterface.MyInterface), "tcp://localhost:8080/RemotingPersonService");            if (obj == null)            {                Console.WriteLine("Couldn't crate Remoting Object .");            }            Console.WriteLine("Please enter your name:");            String name = Console.ReadLine();            try            {                Console.WriteLine(obj.Greeting(name));            }            catch (System.Net.Sockets.SocketException e)            {                Console.WriteLine(e.ToString());            }            Console.ReadLine();        }    }}

 

转载于:https://www.cnblogs.com/zuiyirenjian/p/4172214.html

你可能感兴趣的文章
Union和Union All 的区别
查看>>
Git的安装和使用教程详解
查看>>
lsof命令详解
查看>>
常用模块,异常处理
查看>>
父窗口与子窗口之间的传值
查看>>
eclipse 找不到 tomcat 的解决方案
查看>>
HDU 1890--Robotic Sort(Splay Tree)
查看>>
connection string for Excel/Access 2010
查看>>
【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
查看>>
学习wavenet_vocoder之环境配置
查看>>
常用Maven命令
查看>>
Docker启动mysql的坑2
查看>>
j2ee爬坑行之二 servlet
查看>>
JAVA基础入门(JDK、eclipse下载安装)
查看>>
最基础的applet运用--在applet上画线
查看>>
布局大全
查看>>
eclipse中安装tomcat插件
查看>>
常见设计模式C++代码实现
查看>>
C++线程同步的四种方式(Windows)
查看>>
前端面试集锦(1)
查看>>