Remoting和Web Service是.net中的重要技术,都可用来实现分布式系统开发,如果是不同的平台就只能选择Web Service,但如果是同一平台,就都可以选择了。到底选择那种,当然还有访问效率上的考虑,同时在Remoting中又有三中信道 Http,Tcp,Ipc,它们又各有差别。HTTP方式的信道在跨越防火墙上有优势;TCP方式的信道常用在局域网内通信,速度比HTTP快很 多;IPC信道用于同一台机器的进程间通信,通信不占用网络资源,速度又比TCP快很多。为了能够实际的比较一下这四者的实际访问速度,我写了个小程序用 测试。这个程序的实现很简单利用Remoting三种信道和Web Service 访问同一个对象(相当于实际项目中的业务层),而这个对象实现返回系统的时间。就这么简单。如果有对Remoting和Web Service不太了解的,也可以通过我这个例子熟悉一下Remoting三种信道的写法差别和Web Service的调用。

下面是程序运行的界面,我使用.net中的最小时间度量:刻度(用毫秒在本机上可能都很难测出它们之间的差别),来测试每次调用所发的时间,并通过多次调 用来测的一个平均时间来比较访问的速度。通过测试可以看得出他们四者得访问速度:ipc>tcp>http>Web Service.(其实Remoting的http信道和Web Service的访问速度还有待比较,跟测试的主机还有一定关系,在我办公室里的一台电脑上好像Web service的访问速度更快于http信道),大家可以自己测试一下,或研究一个比较好的方法。

相关代码:

     //使用Http信道
public void Http()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "http://localhost:9001/MyObject");
myObj.GetServerTime();
stopWatch.Stop();
lsbHttp.Items.Add(stopWatch.ElapsedTicks);
}
//使用Tcp信道
public void Tcp()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "tcp://localhost:9002/MyObject");
myObj.GetServerTime();
stopWatch.Stop();
lsbTcp.Items.Add(stopWatch.ElapsedTicks);
}
//使用Ipc信道
public void Ipc()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "Ipc://MyHost/MyObject");
myObj.GetServerTime();
stopWatch.Stop();
lsbIpc.Items.Add(stopWatch.ElapsedTicks);
} //访问Web Service
public void WebService()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
localhost.Service ws = new localhost.Service();
ws.GetServerTime();
stopWatch.Stop();
lsbWeb.Items.Add(stopWatch.ElapsedTicks);
}
private void btnHttp_Click(object sender, EventArgs e)
{
Http();
} private void btnTcp_Click(object sender, EventArgs e)
{
Tcp();
} private void btnWebService_Click(object sender, EventArgs e)
{
WebService();
} private void btnIpc_Click(object sender, EventArgs e)
{
Ipc();
} //开始测试
private void btnStat_Click(object sender, EventArgs e)
{
Int32 Times = int.Parse(txtTimes.Text);
Int64 Sum = ;
double Ave=;
lsbHttp.Items.Clear();
lsbIpc.Items.Clear();
lsbTcp.Items.Clear();
lsbWeb.Items.Clear(); for (Int32 i = ; i < Times; i++)
{
Http();
Tcp();
Ipc();
WebService();
}
//计算平均时间
for(Int32 i=;i<Times;i++)
{
Sum += int.Parse(lsbHttp.Items[i].ToString ());
}
Ave = Sum / Times;
txtHttp.Text = Ave.ToString(); Sum = ;
for (Int32 i = ; i < Times; i++)
{
Sum += int.Parse(lsbTcp.Items[i].ToString());
}
Ave = Sum / Times;
txtTcp.Text = Ave.ToString(); Sum = ;
for (Int32 i = ; i < Times; i++)
{
Sum += int.Parse(lsbWeb.Items[i].ToString());
}
Ave = Sum / Times;
txtWebService.Text = Ave.ToString(); Sum = ;
for (Int32 i = ; i < Times; i++)
{
Sum += int.Parse(lsbIpc.Items[i].ToString());
}
Ave = Sum / Times;
txtIpc.Text = Ave.ToString();
}
HttpChannel httpChannel = new HttpChannel();
ChannelServices.RegisterChannel(httpChannel,false ); TcpChannel tcpChannel = new TcpChannel();
ChannelServices.RegisterChannel(tcpChannel,false ); IpcChannel ipcChannel = new IpcChannel("MyHost");
ChannelServices.RegisterChannel(ipcChannel,false ); RemotingConfiguration .RegisterWellKnownServiceType (typeof (RemoteObject .MyObject ),"MyObject",WellKnownObjectMode.SingleCall);
Console.ReadLine();

.NET Remoting三种信道Http,Tcp,IPC和Web Service的访问速度比较(转)的更多相关文章

  1. 测试Remoting三种信道Http,Tcp,Ipc和Web Service的访问速度 (转)

    Remoting和Web Service是.net中的重要技术,都可用来实现分布式系统开发,如果是不同的平台就只能选择Web Service,但如果是同一平台,就都可以选择了.到底选择那种,当然还有访 ...

  2. angularjs 自定义服务的三种方式

    angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...

  3. SpringMVC 拦截器不拦截静态资源的三种处理方式

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静 ...

  4. tomcat-四种运行模式和三种部署模式(优化)

    四中运行模式如下: 1-bio: 传统的Java I/O操作,同步且阻塞IO. 2-nio: JDK1.4开始支持,同步阻塞或同步非阻塞IO 3-aio(nio.2): JDK7开始支持,异步非阻塞I ...

  5. asp.net 的三种开发模式

    一, Web Pages 是三种创建 ASP.NET 网站和 Web 应用程序的编程模式中的一种. 其他两种编程模式是 Web Forms 和 MVC(Model View Controller 模型 ...

  6. Servlet实现的三种方法

    (1)方法一: //这是第一个实现servlet的方法.使用时限servlet接口的方法来实现,使用的时候须要引用servlet-api.jar package com.lc; import java ...

  7. spring mvc:拦截器不拦截静态资源的三种处理方式

    方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/* ...

  8. APP开发的三种模式

    Hybrid APP混合开发的一些经验和总结 APP开发的三种模式:Native App .web App.hybrid App 1.原生app 使用原生app (android或iOS)开发APP. ...

  9. SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/* ...

随机推荐

  1. Extjs CheckboxSelectionModel 置为无效 选择触发事件

    var smQd = new Ext.grid.CheckboxSelectionModel({ renderer:function(value, metaData, record, rowIndex ...

  2. 解决eclipse安装maven的问题:Unable to update index for central|http://repo1.maven.org/maven2

    问题产生如下:因为单位使用了过滤,访问Internet时,超过10M的内容就拒绝.因为maven插件在初始时,需要下载Maven的index文件,这个文件比较大,有38M多,下载不成功.所以造成使用M ...

  3. springboot-线程池简单使用

    最近做项目,关于订单创建时候因为需要调用远程http服务获取数据,然后校验并写入数据库和修改数据库, 导致接口效率低,所以想到实现异步操作的方式解决. 在调用远程接口成功的时候即认为接口处理成功,返回 ...

  4. Android网络通信Volley框架源代码浅析(二)

    尊重原创 http://write.blog.csdn.net/postedit/25921795 在前面的一片文章Volley框架浅析(一)中我们知道在RequestQueue这个类中,有两个队列: ...

  5. error: conflicting type qualifiers for &#39;xxxxx&#39;

    网上的非常多解释--非常难理解-- 情景描写叙述: 在代码中,写了A\B两个文件,A:是.c文件,B是.h文件和.c文件. 在A中包括了B.h文件. 在B.h文件里声明了A中定义的变量. 这样编译的情 ...

  6. 使用ADB管理Andorid系统软件

    # Usageadb shell pm list packages -fadb shell pm list packages -eadb shell pm list packages -dadb sh ...

  7. Linux获取当前时间

    代码(可以把clock_gettime换成time(NULL)) void getNowTime() { timespec time; clock_gettime(CLOCK_REALTIME, &a ...

  8. android.net.Uri 简介 API

    android.net.Uri 简介 public abstract class android.net.Uri extends Object implements Parcelable, Compa ...

  9. 适配 通知 Notification 通知渠道 前台服务 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. 科幻大片中那些牛X代码真相

    在<黑客帝国>中,救世主Neo的队友通过屏幕上"1"和"0"构成的数据流,就能看到鲜活的画面,这应该算是科幻大片中对代码最极致的表现了.其他科幻电影 ...