对Remoting进行封装,方便使用

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.Xml;
using System.Runtime.Remoting;
using System.Collections;

namespace Tools
{
    /// <summary>
    /// Remote自定义操作类,更方便使用
    /// </summary>
    public class RemoteHelper
    {
        /// <summary>
        /// 服务端注册的端口信息
        /// </summary>
        public static IDictionary ServerHttpProp = new Hashtable();

        /// <summary>
        /// 客户端连接服务端的端口
        /// </summary>
        public static int ClientToServerPort = 8888;

        /// <summary>
        /// 服务端的http地址
        /// </summary>
        private string url = "";

        #region 单个实例  Instance
        private static readonly RemoteHelper instance = new RemoteHelper();
        /// <summary>
        /// 单个实例  Instance
        /// </summary>
        public static RemoteHelper Instance
        {
            get
            {
                return instance;
            }
        }
        #endregion

        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
        private RemoteHelper()
        {
        }
        #endregion

        #region 获取服务端的App.config中配置的http端口号
        /// <summary>
        /// 获取服务端的App.config中配置的http端口号
        /// /configuration/applicationSettings/RemoteServer.Properties.Settings/setting/value
        /// </summary>
        private void GetServerPortInfo()
        {
            string serverPort = "8888";//默认端口
            try
            {
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(Application.ExecutablePath + ".config");
                XmlElement xEleml = (XmlElement)xDoc.SelectSingleNode("/configuration/applicationSettings/RemoteServer.Properties.Settings/setting/value");
                serverPort = xEleml.InnerText;//得到远程端口
            }
            catch
            {
                serverPort = "8888";
            }
            ServerHttpProp["name"] = "http" + serverPort;
            ServerHttpProp["port"] = serverPort;
        }
        private void GetServerPortInfo(int port)
        {
            string serverPort = port.ToString();//默认端口
            ServerHttpProp["name"] = "http" + serverPort;
            ServerHttpProp["port"] = serverPort;
        }
        #endregion

        #region 服务端-注册HttpChane通道
        /// <summary>
        /// 服务端-注册HttpChane通道
        /// </summary>
        public void RegisterServerHttpChanel()
        {
            GetServerPortInfo();
            IChannel chanel = new HttpChannel(ServerHttpProp, new SoapClientFormatterSinkProvider(), new SoapServerFormatterSinkProvider());
            ChannelServices.RegisterChannel(chanel, false);
        }
        /// <summary>
        /// 服务端-注册HttpChane通道
        /// </summary>
        /// <param name="port">商品号</param>
        public void RegisterServerHttpChanel(int port)
        {
            GetServerPortInfo(port);
            IChannel chanel = new HttpChannel(ServerHttpProp, new SoapClientFormatterSinkProvider(), new SoapServerFormatterSinkProvider());
            ChannelServices.RegisterChannel(chanel, false);
        }
        #endregion

        #region 服务端-注册http远程对象,为客户端提供服务
        /// <summary>
        /// 服务端-注册http远程对象,为客户端提供服务
        /// </summary>
        /// <param name="ClassFullPath">实现接口的类全路径(前面要带上命名空间名称)</param>
        /// <param name="ServerProjectName">(服务端)实现接口的类对应的项目名称</param>
        /// <param name="InterfaceNames">服务端和客户端共享的接口名称(可以取其它名称不影响使用)</param>
        public void RegisterServerHttpObject(string ClassFullPath, string ServerProjectName, string InterfaceNames)
        {
            RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType(ClassFullPath + "," + ServerProjectName), InterfaceNames + ".soap", WellKnownObjectMode.Singleton);
        }
        #endregion

        #region 客户端-注册HttpChane通道
        /// <summary>
        /// 客户端-注册HttpChane通道
        /// 获取客户端配置的http地址和端口 /configuration/connectionStrings/add
        /// 格式为: http://127.0.0.1:8888/  最后要带“/”
        /// </summary>
        public void RegisterClientHttpObject()
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(Application.ExecutablePath + ".config");
                this.url = ((XmlElement)xDoc.SelectSingleNode("/configuration/connectionStrings/add")).GetAttribute("connectionString");
            }
            catch (Exception er)
            {
                this.url = "http://127.0.0.1:8888/";
                throw er;
            }
            ClientToServerPort = Convert.ToInt32(url.Split(':')[2].TrimEnd('/'));
            HttpChannel chan2 = new HttpChannel(ClientToServerPort);
            ChannelServices.RegisterChannel(chan2, false);
        }
        /// <summary>
        /// 客户端-注册HttpChane通道
        /// </summary>
        /// <param name="serverIp">服务端ip</param>
        /// <param name="serverPort">服务端端口</param>
        /// <param name="clientPort">客户端端口</param>
        public void RegisterClientHttpObject(string serverIp,int serverPort,int clientPort )
        {
            try
            {
                this.url = string.Format("http://{0}:{1}/",serverIp,serverPort);
            }
            catch (Exception er)
            {
                this.url = "http://127.0.0.1:8888/";
                throw er;
            }
            ClientToServerPort = clientPort;
            HttpChannel chan2 = new HttpChannel(ClientToServerPort);
            ChannelServices.RegisterChannel(chan2, false);
        }
        #endregion

        #region 客户端获得http远程对象
        /// <summary>
        /// 客户端获得http远程对象
        /// </summary>
        /// <param name="type">传入 typeof(存在的接口名称) 即可</param>
        /// <param name="InterfaceNames">服务端注册的(接口)名称</param>
        /// <returns></returns>
        public object GetHttpObject(Type type, string InterfaceNames)
        {
            object serviceObj = Activator.GetObject(type, this.url + InterfaceNames + ".soap");
            if (serviceObj == null)
            {
                MessageBox.Show("远程连接失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return null;
            }
            return serviceObj;

        }
        #endregion

    }
}

 

 

 

使用方法:

 

Interface1代码:

string Getinfo(string type);

 

serverMethod1代码:

public class serverMethod1 : MarshalByRefObject,Interface1
    {
        public string Getinfo(string type)
        {
            if (type == "1") return "这是1";
            else return "参数不是1";
        }
    }

 

 

服务端主要代码 :

 RemoteHelper rh= RemoteHelper.Instance;
           rh.RegisterServerHttpChanel(8400);
           rh.RegisterServerHttpObject("ServerServices.serverMethod1", "ServerServices", "Interface1");

 

客户端主要代码:

private RemoteHelper rh = RemoteHelper.Instance;
        private Interface1 intface = null;
        private void Form1_Load(object sender, EventArgs e)
        {
            rh.RegisterClientHttpObject("127.0.0.1", 8400, 8401);
            intface = (Interface1)rh.GetHttpObject(typeof(Interface1), "Interface1");
        }

private void buttonDoMethod_Click(object sender, EventArgs e)
        {
            MessageBox.Show(intface.Getinfo(textBox1.Text.Trim()), "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
        }

 

效果:

   

 

 

时间: 2024-09-23 15:51:27

对Remoting进行封装,方便使用的相关文章

Remoting编程知识二

编程 Remoting高级知识 一. 如何使用IIS作为激活代理 .NET Remoting和DCOM之间的一个区别是前者不支持自动运行的服务器进程.需要人工启动服务器进程来注册用来远程激活的类和监听请求.而对于DCOM,当远程客户端调用CoCreateInstanceEx或者其他激活API时,会自动运行服务器进程. .NET remoting 提供了两种方法来避免人工启动服务器.第一个是将服务器应用程序当做一个服务来实现.可以编写一个从 System.ServiceProcess.Servic

我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离

我们知道对于Remoting,有两种不同的Activation模式:Server Activation和Client Activation.他我在前面的系列文章中分析.比较了这两种不同激活方式的区别:Marshaling方式,远程对象创建的时机,状态的保持,生命周期的管理. 在编程模式方面Server Activation和Client Activation也具有一定的差异:为一个SAO(server activated object)和一个CAO(client activated object

Remoting和Webservice的详细介绍及区别_实用技巧

Remoting和Webservice区别: 其实现的原理并没有本质的区别,在应用开发层面上有以下区别: 1.Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这样比Web Service稍为高效一些 2.Remoting不是标准,而Web Service是标准: 3.Remoting一般需要通过一个WinForm或是Windows服务进行启动,而Web Service则需要IIS进行启动. 4.在VS.net开

MSMQ,Enterprise Service, DotNet Remoting,Web Servi

对于送耦合的引用,有一下四种选项.1.MSMQ从windows nt 开始微软就开始提供msmq 的支持,一直到现在的3.0,主要提供一下几个特性的支持. 可靠的消息传递,类似mail 系统,有脱机支持可设置消息的优先级,Label的各种额外的标示事务支持通过DC,IC的灵活应用,有好的缩放性对于客户端,要求必须是windows 系统,从windowsce 到windows .net 2003 都作支持.可以通过连接器跟其他的非微软技术集成.NET 有一个专门的封装 System.Messain

Microsoft .Net Remoting系列教程之二:Marshal、Disconnect与生命周期以及跟踪服务_自学过程

一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是将该远程对象注册到通道中.由于Remoting没有提供与之对应的Unregister方法来注销远程对象,所以如果需要注册/注销指定对象,微软推荐使用Marshal(一般译为编组)和Disconnect配对使用.在<Net Remoting基础篇>中我已经谈到:Marshal()方法是将MarshalByRefObject类对象转化为ObjRef类对象,这个

.net remoting怎么不停的给服务器发送数据啊

问题描述 客户端A点一下调用服务器B程序中的一个函数fun,fun里面有一个循环,循环的每一步都要把结果反馈给客户端显示,而且速度要很快.socket好像可以解决,但自己封装太太太麻烦了,而且稳定性安全性还不能保证这个功能能用.netremoting实现吗,用里面什么机制,能否给点关键性的代码?效率怎么样? 解决方案 解决方案二:可以的,效率不知道--解决方案三:remoting是同步的,就是说你一次调用,只能返回一次,不能象你想象的那样,调一次,不停的往客户端返回数据,做不到的,remotin

艾伟:Remoting和Webservice的区别

本系列文章导航 创建一个示例和WebMethod特性解析 WebService特性和数组类型解析 类和结构体解析 利用YAHOO公开API做天气预报Web服务 Webservice 的设计和模式 Remoting和Webservice的区别 其实现的原理并没有本质的区别,在应用开发层面上有以下区别: 1.Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这样比Web Service稍为高效一些 2.Remotin

艾伟_转载:WCF、Net remoting、Web service概念及区别

Windows通信基础(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK). WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM.Remoting.Web Service.WSE.MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准. WCF是建立在.Net Framework 2.0基础之上的,包含在.NET 3.0/3.5

WCF、Net remoting、Web service概念及区别

Windows通信基础(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK). WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM.Remoting.Web Service.WSE.MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准. WCF是建立在.Net Framework 2.0基础之上的,包含在.NET 3.0/3.5