使用Remoting技术

         在Wifi网络环境下,我们常用WebService作为服务程序构建分布式的应用程序系统,但是现在越来越多的应用在GPRS网络,因此WebService访问性能的问题渐渐体现出来.为了解决GPRS网络下快速构建分布式应用系统的问题,必须找到一种访问效率高于WebService,且开发效率高于直接采用Socket的方式.基于以上原因,我们尝试采用Remoting技术作为服务程序提供服务.
         Remoting技术实质上是Dll的远程调用技术,由于该技术支持HTTP,TCP和IPC方式,因此,直觉上感觉使用该技术传输XML,效率要高于WebService和Servlet方式,本文设计了一个简单的用于XML传送的Remoting,并与WebService做了测试,实验表明,Remoting采用Tcpip时运行效率远高于WebService.
         采用Remoting方式传输字符串时需要构建一个中间DLL,该DLL需要同时加载到服务器端和客户端,客户端通过实例化服务器端的DLL中的类对象,并调用其中的方法实现XML字符串的传递.
         程序实现如下:
1.公共DLL
namespace StringBridge
{
    public class StringBridge: System.MarshalByRefObject
    {
        protected string strXml = "";
        public StringBridge()
        {
            ......
        }
        //客户端调用,用于获取传送过来的字符串
        public void SetString(string strXml)
        {
            this.strXml = strXml;
     Console.Writeln(strXml); //测试输出
            return;

        }
    }
}
注:从System.MarshalByRefObject类继承出来的对象在运行时不会离开自己的程序域,事实上从该基类下派生的子类可以被客户端远程调用.
2.服务器端:
创建控制台应用程序,导入System.Runtime.Remoting命名空间,然后再导入StringBridge库.
 using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpServerChannel tcpServer = new TcpServerChannel(8086);
            ChannelServices.RegisterChannel(tcpServer, false);
            System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(typeof(StringBridge.StringBridge), "Hi",
                WellKnownObjectMode.SingleCall); //告诉远程客户端,那个对象可以被调用.
            System.Console.WriteLine("Press return to exit");
            System.Console.ReadLine();
        }
    }
}
WellKnownObjectMode.SingleCall属性告诉服务程序每次有客户端登录时为客户端创建一个独立的实例.
注意:System.Runtime.Remoting命名空间要通过"引用"-"添加引用"-".Net"-"System.Runtime.Remoting"来引用.
3.客户端:
创建控制台应用程序,同样导入System.Runtime.Remoting命名空间,然后再导入StringBridge库.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            ChannelServices.RegisterChannel(new TcpClientChannel(), false);
            StringBridge.StringBridge obj = (StringBridge.StringBridge)Activator.GetObject(typeof(RemoteHello.Hello),"tcp://localhost:8086/Hi");

            obj.SetString("<MESSAGE><HEAD><ACTIONID>LOGIN</ACTIONID></HEAD></MESSAGE>"); //调用方法传送字符串          
            Console.ReadLine();
        }
    }
}

运行服务器端程序,然后在运行客户端程序,会看到客户端的XML发送到了服务器端.
建立实现相同功能的WebService,分别在WebService上和Remoting方式调用1000次该操作,共做10组操作,WIFI网络上平均运行时间分别8900ms和691ms,由此可见,后者比前者性能提高10倍,完全可以适应GPRS这种低速网络 

转载于:https://www.cnblogs.com/wude/archive/2008/04/17/1941629.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序云开发实战 - 口袋工具之“历史上的今天”

前言 本项目是一个基于云开发的小程序。 本文选取项目中的一个页面 -- 历史上的今天 来做一个云开发的分享&#xff0c;会涉及云函数和云数据库。 由于是实战项目&#xff0c;关于小程序的基础知识请移步官方文档&#xff0c;本文不再赘述。 项目预览 微信搜索&#xff1a; 口袋…

Redis启动的三种方式

Part I. 直接启动 下载 官网下载&#xff1a;http://redis.io/download 安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行make install&#xff0c;将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。 make …

第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式

通过将应用程序迁移到云平台中&#xff0c;企业可以提高安全性、数据访问、可扩展性和IT灵活性。将业务迁移到云平台还可以为企业节省成本。以下是导致企业云迁移失败的五个主要原因以及其解决方法。 作者&#xff1a;Andy Patrizio 对于大多数企业而言&#xff0c;将业务迁移…

UML、XML、WebService,NUnit单元测试,测试驱动开发,httphandl,httpmodel

这几个东西还要进一步加深理解 转载于:https://www.cnblogs.com/liugod/archive/2008/04/24/1169898.html

每天一个linux命令(30): chown命令

原文地址&#xff1a;http://www.cnblogs.com/peida/archive/2012/12/04/2800684.html chown将指定文件的拥有者改为指定的用户或组&#xff0c;用户可以是用户名或者用户ID&#xff1b;组可以是组名或者组ID&#xff1b;文件是以空格分开的要改变权限的文件列表&#xff0c;支…

mybatis学习(14):log4j:ERROR Category option 1 not a decimal integer.

log4j:ERROR Category option " 1 " not a decimal integer. java.lang.NumberFormatException: For input string: " 1 " 修改log4j.xml配置文件 ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRollingFile,ROLLING_…

在PEA上海做演讲主题:大型、高负载网站架构和应用初探

主题&#xff1a;大型、高负载网站架构和应用初探时间&#xff1a;30-45分钟 开题&#xff1a;163,sina,sohu等网站他们有很多应用程序都是PHP写的&#xff0c;为什么他们究竟是如何能做出同时跑几千人甚至上万同时在线应用程序呢? 挑选性能更好web服务器 单台 Apache web se…

数论考试题(b) 求约数的约数的最大个数

题意&#xff1a;求1~n范围里约数的约数的个数加起来最多的是哪个数 及其总数 题解&#xff1a; /* 对一个数质因数分解 首先要知道两个公式&#xff1a;约数的个数的公式&#xff0c;和约数的约数的个数的公式(详见题解) 然后发现&#xff1a;质因数分解后 小的次冥尽量大 会…

Anaconda 安装

参考网址&#xff1a;http://www.jianshu.com/p/169403f7e40c http://blog.csdn.net/qq_26898461/article/details/51488326 Anaconda基础 什么是Anaconda Anaconda是一个用于科学计算的Python发行版&#xff0c;支持 Linux, Mac, Windows系统&#xff0c;提供了包管理与环境管…

mybatis学习(15):mybatis连接mysql数据库

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(String id); }BlogMapper.xml <?xml version"1.0" encoding"UTF-8" ?>…

JavaScript HTML DOM元素节点常用操作接口

在文档对象模型 (DOM) 中&#xff0c;每个节点都是一个对象。DOM 节点有三个重要的属性 &#xff1a; 1. nodeName : 节点的名称 2. nodeValue &#xff1a;节点的值 3. nodeType &#xff1a;节点的类型 节点类型&#xff1a;元素 1 &#xff0c;属性 2 &#xff0c;文本 3 &a…

[导入]九个笑话能告诉你九个人生的道理

九个笑话能告诉你九个人生的道理,你要看吗1、建筑师 一位夫人打电话给建筑师&#xff0c;说每当火车经过时&#xff0c;她的睡床就会摇动。 “这简直是无稽之谈&#xff11;建筑师回答说&#xff0c;“我来看看。” 建筑师到达后&#xff0c;夫人建议他躺在床上&#xff0c;体会…

nodejs对mongodb数据库的增删改查操作(转载)

首先要确保mongodb的正确安装&#xff0c;安装参照&#xff1a;http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian-or-ubuntu-linux 另外可以参考我的另一篇博文 http://www.cnblogs.com/sexintercourse/p/5774310.html 指导mongo和nodejs的开发 然后下载nod…

mybatis学习(16):不使用接口的方式

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Inteage id); }BlogMapper.xml <?xml version"1.0" encoding"UTF-8" ?>…

AS3图像抖动效果源码。

DemoSourceWebsite转载于:https://www.cnblogs.com/xxcainiao/archive/2008/05/07/1186805.html

mybatis学习(17):列名与属性名不一致的情况(使用别名)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Inteage id); }BlogMapper.xml <?xml version"1.0" encoding"UTF-8" ?>…

mybatis学习(18):列名与属性名不一致的情况(使用ResultMap)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer id);Blog selectBlog2(Integer id); }BlogMapper.xml <?xml version"1.0" en…

git基础-远程仓库的使用

远程仓库的使用 为了能在任意 Git 项目上协作&#xff0c;你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库&#xff0c;通常有些仓库对你只读&#xff0c;有些则可以读写。 与他人协作涉及管理远程仓库以…

MVCToolKit中HtmlHelper.ActionLink的BUG?

分页时<%if (ViewData.Accounts.IsPreviousPage) { %><%Html.ActionLink<SpeakOutFreely.Controllers.ManageController>(c >c.List(ViewData.Accounts.PageIndex -1), "Previous")%><%} %><%if (ViewData.Accounts.IsNextPage) { %&g…

PyChram简单使用教程

一、PyChram下载 官网&#xff1a;http://www.jetbrains.com/pycharm Windows:http://www.jetbrains.com/pycharm/download/#sectionwindows Linux:http://www.jetbrains.com/pycharm/download/#sectionlinux Mac:http://www.jetbrains.com/pycharm/download/# 二、PyChram简单…