实现一个压缩Remoting传输数据的Sink:CompressionSink (转载)
2006-04-04 11:06
561 查看
在前两讲《初探.Net Remoting服务端 Loading Remtoing配置内容的过程 》《初探.Net Remoting客户端 Loading Remtoing配置内容的过程 》中,我已经分析了Remoting 的Sink机制,接下来,就提供一个具体的范例:CompressionSink(原始SourceCode源于Advanced .Net Remoting 1StED)。 CompressionSink通过在客户端和服务端各自插入一个数据压缩-解压缩的Sink。目的是希望减少大数据量传递对网络带宽的占用,提高传输效率。下载SourceCode ,BTW,这个压缩Sink相对比较稳定,大家可以在各自的项目中放心使用。:-)
详细设计:
提供一个Assembly: CompressionSink.dll
它包括:
客户端:
CompressionSink.CompressionClientSinkProvider类和CompressionSink.CompressionClientSink类
服务端:
CompressionSink.CompressionServerSinkProvider类和CompressionSink.CompressionServerSink类
压缩类:CompressionHelper
压缩内核:NZipLib库。
客户端的配置文件 :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http">
<clientProviders>
<formatter ref="soap" />
<provider type="CompressionSink.CompressionClientSinkProvider, CompressionSink" />
</clientProviders>
</channel>
</channels>
<client>
<wellknown type="Service.SomeSAO, Service" url="http://localhost:5555/SomeSAO.soap" />
</client>
</application>
</system.runtime.remoting>
</configuration>
服务端的配置文件 :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="5555">
<serverProviders>
<provider type="CompressionSink.CompressionServerSinkProvider, CompressionSink" />
<formatter ref="soap"/>
</serverProviders>
</channel>
</channels>
<service>
<wellknown mode="Singleton" type="Service.SomeSAO, Service" objectUri="SomeSAO.soap" />
</service>
</application>
</system.runtime.remoting>
</configuration>
public class CompressionClientSinkProvider: IClientChannelSinkProvider
public class CompressionClientSink: BaseChannelSinkWithProperties,
2 IClientChannelSink
3public class CompressionServerSinkProvider: IServerChannelSinkProvider
2using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
using System.IO;
namespace CompressionSink
1public class CompressionHelper
2 {
3{
11{
18{
34{
40{
43{
47 break;
48 }
49 }
50 unCompressStream.Close();
51 //modify by zendy//这个设置非常重要,否则会导致后续Sink在处理该stream时失败,,在原来的源码中就是因为没有这个处理导致程序运行失败
52 outStream.Seek(0,SeekOrigin.Begin);
53 return outStream;
54 }
55 }
BTW,这个Sink还可以扩展,比如判断需要压缩Stream的大小,如果很大,就压缩,否则不压缩(可以在responseHeaders和requestHeaders添加是否 已经压缩的标记)
详细设计:
提供一个Assembly: CompressionSink.dll
它包括:
客户端:
CompressionSink.CompressionClientSinkProvider类和CompressionSink.CompressionClientSink类
服务端:
CompressionSink.CompressionServerSinkProvider类和CompressionSink.CompressionServerSink类
压缩类:CompressionHelper
压缩内核:NZipLib库。
客户端的配置文件 :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http">
<clientProviders>
<formatter ref="soap" />
<provider type="CompressionSink.CompressionClientSinkProvider, CompressionSink" />
</clientProviders>
</channel>
</channels>
<client>
<wellknown type="Service.SomeSAO, Service" url="http://localhost:5555/SomeSAO.soap" />
</client>
</application>
</system.runtime.remoting>
</configuration>
服务端的配置文件 :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="5555">
<serverProviders>
<provider type="CompressionSink.CompressionServerSinkProvider, CompressionSink" />
<formatter ref="soap"/>
</serverProviders>
</channel>
</channels>
<service>
<wellknown mode="Singleton" type="Service.SomeSAO, Service" objectUri="SomeSAO.soap" />
</service>
</application>
</system.runtime.remoting>
</configuration>
public class CompressionClientSinkProvider: IClientChannelSinkProvider
public class CompressionClientSink: BaseChannelSinkWithProperties,
2 IClientChannelSink
3public class CompressionServerSinkProvider: IServerChannelSinkProvider
2using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
using System.IO;
namespace CompressionSink
1public class CompressionHelper
2 {
3{
11{
18{
34{
40{
43{
47 break;
48 }
49 }
50 unCompressStream.Close();
51 //modify by zendy//这个设置非常重要,否则会导致后续Sink在处理该stream时失败,,在原来的源码中就是因为没有这个处理导致程序运行失败
52 outStream.Seek(0,SeekOrigin.Begin);
53 return outStream;
54 }
55 }
BTW,这个Sink还可以扩展,比如判断需要压缩Stream的大小,如果很大,就压缩,否则不压缩(可以在responseHeaders和requestHeaders添加是否 已经压缩的标记)
相关文章推荐
- 实现一个压缩Remoting传输数据的Sink:CompressionSink (转载)
- 实现一个压缩Remoting传输数据的Sink:CompressionSink
- 实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 key
- 实现一个简单的摄像功能(不带传输数据)代码片段
- 【转载】NVelocity入门,为服务器与客户端传输xml数据,实现Ajax通信铺平道路
- UniGui如何实现压缩传输数据?
- castor + xml schema 实现webservice中复杂结构数据传输-转载 [Zone Yan]
- (转载)利用HttpWebRequest通过POST Json数据在.net后台实现不同平台间的数据传输
- 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩
- 使用Java实现网络传输数据的压缩
- [转载]C# TCP实现多个客户端与服务端 数据 与 文件的传输
- 使用Java实现网络传输数据的压缩.
- 实现一个简单的多线程数据传输和文件传输
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(六)RTP音视频传输解析层之音视频数据传输格式
- 如何自定义一个Remoting中Sink对象实现特定协议上的消息转发
- 实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 key
- TCP协议可靠性数据传输实现原理分析
- 用Python实现一个简单的文件传输协议
- Delphi实现WebService带身份认证的数据传输
- 学习之路三十五:Android和WCF通信 - 大数据压缩后传输