Thrift初探:简单实现C#通讯服务程序

好久没有写文章了,由于换工作了,所以一直没有时间来写博。今天抽个空练练手下~最近接触了下Thrift,网上也有很多文章对于Thrift做了说明: 
      Thrift是一种可伸缩的跨语言服务框架,它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与 C++,C#,Java,Python和PHP和Ruby结合。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译 器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。 
      它的好处是什么?当然是它支持大多数时下流行的语言。通过Thrift命令自动生成相应的语言脚本。而进行一些性能对比中,它的好处显而易见。

以上是传输相同的内容时内容大小的对比。

以上是运行开销比较结果。

TCompactProtocol和TBinaryProtocol是Thrift支持的两种协议,其中TCompactProtocol使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。

详细可以查看:http://www.javabloger.com/article/apache-thrift-architecture.html

接下来,我想讲述一下如何使用Thrift搭建C#版的客户端以及服务端通讯的程序。

1. 先从官网下载Thrift安装包以及签出SVN源码:

官网下载地址:http://thrift.apache.org/download/

这里我下载了一个Thrift compiler for Windows版本的EXE文件(thrift-0.7.0.exe)

签出SVN源码地址:http://svn.apache.org/repos/asf/thrift/trunk

2. 这里我利用文章(http://www.javabloger.com/article/thrift-java-code-example.html)的例子(该例子生成Java源码的),完成一个C#版本的示例。

3. 首先创建脚本,命名为textCsharp.thrift,脚本内容如下:


namespace java com.javabloger.gen.code   #  注释1

struct Blog {   #  注释2 
    1: string topic 
    2: binary content 
    3: i64    createdTime 
    4: string id 
    5: string ipAddress 
    6: map<string,string> props 
  } service ThriftCase {  #  注释3 
    i32 testCase1(1:i32 num1, 2:i32 num2, 3:string  num3)  #  注释4     list<string> testCase2(1:map<string,string>  num1)     void testCase3()    void testCase4(1:list<Blog> blog)  
}

4. 执行thrift命令:thrift -gen csharp testCsharp.thrift,这里说明一下:参数"csharp”意味着这里将自动生成C#代码,如果这里写java,python等等,可以用"java"或者"py”代替。

于是得到gen-csharp的目录,这个目录里面就包含支持Thrift的Blog以及ThriftCase的源代码,具体里面都生成什么代码,后面会做出介绍。

5. 然后,我现在打开SVN源码中的 trunk\lib\csharp\ 路径,我用项目打开

编译后,得到Thrift.dll文件,为了后面使用Thrift做准备。

6.新建工程,添加Server以及Client项目,把刚才生成的代码文件放入Common项目中。让Client和Server项目引用Thrift.dll类库。

7. 编写服务端程序:


public class Server 

    public void Start() 
    { 
        TServerSocket serverTransport = new TServerSocket(7911, 0, false); 
        ThriftCase.Processor processor = new ThriftCase.Processor(new BusinessImpl()); 
        TServer server = new TSimpleServer(processor, serverTransport); 
        Console.WriteLine("Starting server on port 7911 ..."); 
        server.Serve(); 
    } 

其中BusinessImpl具体提供业务逻辑的实现:


public class BusinessImpl : ThriftCase.Iface 
    { 
        public int testCase1(int num1, int num2, String num3) 
        { 
             int i = num1 + num2; 
             Console.Write( "testCase1  num1+num2 is :"+ i); 
            Console.WriteLine( "   num3 is :"+ num3); 
             return i; 
        }         public List<String> testCase2(Dictionary<String, String> num1) 
        { 
            Console.WriteLine("testCase2 num1 :" + num1); 
            List<String> list = new List<String>(); 
            list.Add("num1"); 
            return list; 
        }         public void testCase3() 
        { 
            Console.WriteLine("testCase3 ..........." + DateTime.Now); 
        }         public void testCase4(List<Blog> blogs) 
        { 
            Console.WriteLine("testCase4 ..........."); 
        
            for (int i = 0; i < blogs.Count; i++) 
            { 
                Blog blog = blogs[i]; 
                Console.Write("id:" + blog.Id); 
                Console.Write(",IpAddress:" + blog.IpAddress); 
                //Console.Write (",Content:" + new String(blog.Content)); 
                Console.Write(",topic:" + blog.Topic); 
                Console.Write(",time:" + blog.CreatedTime); 
            } 
            Console.WriteLine("\n"); 
        } 
    }

让它继承ThriftCase.Iface接口。

8. 编写客户端程序:


 class Client 
    { 
        static Dictionary<String, String> map = new Dictionary<String, String>(); 
        static List<Blog> blogs = new List<Blog>();         static void Main(string[] args) 
        { 
            TTransport transport = new TSocket("localhost", 7911); 
            TProtocol protocol = new TBinaryProtocol(transport); 
            ThriftCase.Client client = new ThriftCase.Client(protocol); 
            transport.Open(); 
            Console.WriteLine("Client calls ....."); 
            map.Add("blog", "http://www.javabloger.com%22);/             client.testCase1(10, 21, "3"); 
            client.testCase2(map); 
            client.testCase3();             Blog blog = new Blog(); 
            //blog.setContent("this is blog content".getBytes()); 
            blog.CreatedTime = DateTime.Now.Ticks; 
            blog.Id = "123456"; 
            blog.IpAddress = "127.0.0.1"; 
            blog.Topic = "this is blog topic"; 
            blogs.Add(blog); 
            
            client.testCase4(blogs); 
            
            transport.Close();             Console.ReadKey(); 
        } 
    }

9. 运行Server以及Client:

从客户端调用的方法,服务端已经接收到了数据。

源代码下载:ThriftCSharp.rar

后面的文章,我会具体介绍下Thrift的工作机制和原理。

 
分类: C#.net

Thrift实现C#通讯服务程序的更多相关文章

  1. Thrift初探:简单实现C#通讯服务程序

    Thrift是一种可伸缩的跨语言服务框架,它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C++,C#,Java,Python和PHP和Ruby结合.thrift允许你定义一个 ...

  2. Thrift 简单实现C#通讯服务程序 (跨语言 MicroServices)

    Thrift是一种可伸缩的跨语言服务框架,它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C++,C#,Java,Python和PHP和Ruby结合.thrift允许你定义一个 ...

  3. Thrift之双向通讯

    在实际应用中,却经常会有客户端建立连接后,等待服务端数据的长连接模式,也可以称为双向连接.一.双连接,服务端与客户端都开ThriftServer如果网络环境可控,可以让服务端与客户端互相访问,你可以给 ...

  4. Thrift简析

    Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决faceboo ...

  5. Thrift全面介绍

    官网:http://thrift.apache.org   简介 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java ...

  6. thrift使用

    一.什么是thrift Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务.它被当作一个远程过程调用(RPC)框架来使用,是由FaceBook为“大规模跨语言服务开发”而开 ...

  7. .net core高性能通讯开源组件BeetleX

    BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便.性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的T ...

  8. BeetleX高性能通讯开源组件

    net core高性能通讯开源组件BeetleX https://www.cnblogs.com/smark/p/9617682.html BeetleX beetleX是基于dotnet core实 ...

  9. Protobuf C#教程 ThriftC#教程大合辑

    android与PC,C#与Java 利用protobuf 进行无障碍通讯[Socket] http://www.cnblogs.com/TerryBlog/archive/2011/04/23/20 ...

随机推荐

  1. 【C++基金会 06】explictkeyword

    C++提供keywordexplicit,你应该不能阻止的转换构造隐式转换发生的同意.声明explicit的构造不能在一个隐式转换使用. 1.演示样例 我们先来看一段演示样例代码: class A { ...

  2. C#中的动态特性

    众所周知,C#和Java一样,都是一门静态语言.在C# 4.0之前,想要和动态语言(诸如Python.Javascript等)进行方便地互操作是一件不太容易的事情.而C# 4.0为我们带来的dynam ...

  3. 策略模式设计模式(Strategy)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将 ...

  4. Unity3D根据游戏的发展Terrain Toolkit地形生产

     今天我们继续给我Unity3D游戏开发系列.今天我们来通过Terrain Toolkit为了使地形. 虽然Unity3D它为我们提供了一个地形渲染工具,我们发现,这个地形绘制工具并不能满足我们的 ...

  5. Linux在device is busy处理

    在Linux管理umount设备时,时常会遇到"device is busy", 假设umount一个文件系统碰到这样的情况.而且你并没有在所需卸载的文件夹下.那么非常可能实用户或 ...

  6. Unity3D移动端内存优化(NGUI方面)

     Unity3D引擎技术交流QQ群:[21568554] 做3d移动端内存一直是人们头疼的问题,载入的资源释放了,还有其它的须要释放.比方ngui释放,事实上主要是NGUI的Texture和Spr ...

  7. SAP ABAP规划 使用LOOP READ TABLE该方法取代双LOOP内部表的方法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVlemhhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  8. .net程序调用检测和性能分析工具——DotTrace

    DotTrace可以对.net程序进行性能监测,对正在运行的程序和网站监控,主要界面如下: 需要将该工具安装在程序运行的服务器上. 主要用到这个视图,显示了每个方法的时间,下面是反编译出来的代码. P ...

  9. Android——保存并读取文件

    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,仅仅能被应用本身訪问,在该模式下,写入的内容会覆盖原文件的内容,假设想把新写入的内容追加到原文件里.能够使用Contex ...

  10. 从头开始学JavaScript (十一)——Object类型

    原文:从头开始学JavaScript (十一)--Object类型 一.object类型 一个object就是一系列属性的集合,一个属性包含一个名字(属性名)和一个值(属性值). object对于在应 ...