//Server:
TProtocolFactory ProtocolFactory = new TBinaryProtocol.Factory(true, true);
TTransportFactory TransportFactory = new TFramedTransport.Factory();
serverTransport = new TServerSocket(this._port, 0, false);
ThriftService.Processor processor = new ThriftService.Processor(new ThriftServiceImpl(_frm));
TMultiplexedProcessor multiplex = new TMultiplexedProcessor();
multiplex.RegisterProcessor("RTDListenerService", processor);
server = new TThreadPoolServer(processor, serverTransport, TransportFactory, ProtocolFactory); //Client:
TTransport trans = new TSocket("10.232.158.49", 8083);
TProtocol Protocol = new TBinaryProtocol(trans, true, true);
TMultiplexedProtocol multiplex = new TMultiplexedProtocol(Protocol, "RTDListenerService");
ThriftService.Iface client = new ThriftService.Client(multiplex);
client.RquestThriftNoReply(null);

/* * Thrift的RPC调用的一个完整流程: * 首先是通过Thrift的编译器生成的客户端,将调用信息(方法名,参数信息)以指定的协议进行封装, * 而传输层TTransport是对协议层的封装进行处理(比如封装成帧frame),并通过网络发送出去。 * 服务端这边流程跟客户端相反,收到客户端发过来的数据后,首先经过传输层对传过来的数据进行处理, * 然后使用特定的协议(跟客户端是一一对应的)进行解析,然后再通过生成的Processor调用用户编写的代码, * 如果有返回值的话,返回值以逆向的顺序,即通过协议层封装,然后传输层处理对数据进行发送, * 到了客户端那边就是对服务端返回的数据进行处理,使用特定协议进行解析,然后得到一个调用个的结果。 * * 基本类型 * bool:布尔值(true或者false) * byte:8位的有符号字节(byte类型) * i16:16位的有符号整数(short类型) * i32:32位的有符号整数(int类型) * i64:64位的有符号长整型(long类型) * double:一个64位的浮点数(double类型) * string: 一个utf8编码的字符串文本(String) * * 集合类型 * list:一个有序的元素列表。元素可以重复。 * set:一个无序的元素集合,集合中元素不能重复。 * map:一个键值对的数据结构,相当于Java中的HashMap。 * * 异常类型Exceptions * Thrift的异常类型,除了是继承于静态异常基类以外,其他的跟struct是类似的。表示的是一个异常对象。 * * 服务类型Services Server: 4.服务层, 整合上述组件, 提供网络模型(单线程/多线程/事件驱动), 最终形成真正的服务. * Thrift 的service类型相当于定义一个面向对象编程的一个接口。Thrift的编译器会根据这个接口定义来生成服务端和客户端的接口实现代码。 * * Thrift的传输格式(协议层)1.protocol: 协议层, 定义数据传输格式,可以为二进制或者XML等 * TBinaryProtocol: 二进制格式。效率显然高于文本格式 * TCompactProtocol:压缩格式。在二进制基础上进一步压缩。 * TJSONProtocol:JSON格式。 * TSimpleJSONProtocol:提供JSON只写协议(缺少元数据信息),生成的文件很容易用过脚本语言解析。 * TDebugProtocol:使用易懂的刻度文本格式,以便于调试。 * * Thrift的数据传输方式(传输层) 2. Transport: 传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等 * TSocket:阻塞式socket。 * TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用。 * TFileTransport:以文件形式进行传输。 * TMemoryTransport:将内存用于I/O,Java是现实内部实际使用了简单的ByteArrayOutputStream。 * TZlibTransport:使用zlib进行压缩,与其他传输方式联合使用。当前无java实现。 * * Thrift的服务模型 Processor: 3. 处理层, 这部分由定义的idl来生成, 封装了协议输入输出流, 并委托给用户实现的handler进行处理. * TSimpleServer: 简单的单线程服务模型,常用于测试。只在一个单独的线程中以阻塞I/O的方式来提供服务。所以它只能服务一个客户端连接,其他所有客户端在被服务器端接受之前都只能等待。 * TNonblockingServer: 它使用了非阻塞式I/O,使用了java.nio.channels.Selector,通过调用select(),它使得程序阻塞在多个连接上,而不是单一的一个连接上。TNonblockingServer处理这些连接的时候,要么接受它,要么从它那读数据,要么把数据写到它那里,然后再次调用select()来等待下一个准备好的可用的连接。通用这种方式,server可同时服务多个客户端,而不会出现一个客户端把其他客户端全部“饿死”的情况。缺点是所有消息是被调用select()方法的同一个线程处理的,服务端同一时间只会处理一个消息,并没有实现并行处理。 * THsHaServer:(半同步半异步server) 针对TNonblockingServer存在的问题,THsHaServer应运而生。它使用一个单独的线程专门负责I/O,同样使用java.nio.channels.Selector,通过调用select()。然后再利用一个独立的worker线程池来处理消息。只要有空闲的worker线程,消息就会被立即处理,因此多条消息能被并行处理。效率进一步得到了提高。 * TThreadedSelectorServer: 它与THsHaServer的主要区别在于,TThreadedSelectorServer允许你用多个线程来处理网络I/O。它维护了两个线程池,一个用来处理网络I/O,另一个用来进行请求的处理。 * TThreadPoolServer: 它使用的是一种多线程服务模型,使用标准的阻塞式I/O。它会使用一个单独的线程来接收连接。一旦接受了一个连接,它就会被放入ThreadPoolExecutor中的一个worker线程里处理。worker线程被绑定到特定的客户端连接上,直到它关闭。一旦连接关闭,该worker线程就又回到了线程池中。 这意味着,如果有1万个并发的客户端连接,你就需要运行1万个线程。所以它对系统资源的消耗不像其他类型的server一样那么“友好”。此外,如果客户端数量超过了线程池中的最大线程数,在有一个worker线程可用之前,请求将被一直阻塞在那里。 如果提前知道了将要连接到服务器上的客户端数量,并且不介意运行大量线程的话,TThreadPoolServer可能是个很好的选择 * * cmd命令: * thrift-0.9.1.exe -help * thrift-0.9.1.exe -r -gen java data.thrift * thrift-0.9.1.exe -r -gen py data.thrift * thrift-0.9.1.exe -r -gen csharp data.thrift */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Threading.Tasks; using System.Collections; using Thrift.Transport; using Thrift.Server; using Thrift.Protocol; namespace TestThriftProject { public partial class FrmTest : Form { public FrmTest() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text != null) { TTransport transport = new TSocket("127.0.0.1", , ); TProtocol protocol = new TBinaryProtocol(transport);//协议要和服务端一致  HelloWorldService.Client client = new HelloWorldService.Client(protocol); try { transport.Open(); String result = client.SayHello(textBox1.Text.Trim()); Console.WriteLine("Thrift client result =: " + result); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally { if (transport != null) { transport.Close(); } } } } private void FrmTest_Load(object sender, EventArgs e) { new Task(new Action(() => { try { TServerSocket serverTransport = new TServerSocket(, , false); HelloWorldService.Processor processor = new HelloWorldService.Processor(new HelloWroldImpl()); TServer server = new TSimpleServer(processor, serverTransport); server.Serve(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } })).Start(); } } }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace TestThriftProject
{
public class HelloWroldImpl : HelloWorldService.Iface
{
public string SayHello(string username)
{
return string.Format("{0:yyyy/MM/dd hh:mm:ss} hello: {1}", DateTime.Now, username);
}
}
}

Thrift_简介(基于C#)的更多相关文章

  1. nxlog4go 简介 - 基于log4go的下一代go语言日志系统

    nxlog4go的项目网址: https://github.com/ccpaging/nxlog4go 项目历史 ccpaging's log4go forked from https://githu ...

  2. 分类算法简介 基于R

    最近的关键字:分类算法,outlier detection, machine learning 简介: 此文将 k-means,decision tree,random forest,SVM(supp ...

  3. LambdaMART简介——基于Ranklib源码(二 Regression Tree训练)

    上一节中介绍了 $ \lambda $ 的计算,lambdaMART就以计算的每个doc的 $\lambda$ 值作为label,训练Regression Tree,并在最后对叶子节点上的样本 $la ...

  4. RRDTool 存储原理简介——基于时间序列的环型数据库

    转自:http://www.jianshu.com/p/b925b1584ab2 RRDTool是一套监测工具,可用于存储和展示被监测对象随时间的变化情况.比如,我们在 Windows 电脑上常见的内 ...

  5. LambdaMART简介——基于Ranklib源码(一 lambda计算)

    学习Machine Learning,阅读文献,看各种数学公式的推导,其实是一件很枯燥的事情.有的时候即使理解了数学推导过程,也仍然会一知半解,离自己写程序实现,似乎还有一道鸿沟.所幸的是,现在很多主 ...

  6. 关于海康视频采集卡的简介---基于pci的插潮采集卡

    vga 640x480 qvga vga的1/4,宽高分别是vga的一半 (1)采集类型 海康威视 DS-2CE16A2P-IT3P 700TVL 1/3" DIS ICR 红外防水筒型摄像 ...

  7. [译]基于GPU的体渲染高级技术之raycasting算法

    [译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...

  8. JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素

    (注:简介基于IDEA的版本为:11.0,下载地址:http://www.jetbrains.com/idea/) 打开IDEA,(当第一次打开的时候出现的是一个欢迎页面,随便创建一个project来 ...

  9. SmartBusinessDevFramework架构设计-1:结构简介

    SmartBusinessDevFramework 简介 基于.net 4.0 开发的企业级系统框架 功能 1 自定义ORM.如果客官喜欢NHibernate EntityFramework ,并对其 ...

随机推荐

  1. 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome

    给 Linux 系统"减肥",系统垃圾清理  2013/10/16  linux  系统安装与配置管理  评论  15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...

  2. 基于 node 搭建博客系统(一)

    系统分为两端,分别实现. 管理员端: 功能 :个人信息,设置,发布随笔,随笔列表,删除随笔,查找,文章 等. 技术点:Boostrap + AdminLTE; 基于nodejs 实现的express ...

  3. python第五十四天--第十周作业

    SELECT版FTP:使用SELECT或SELECTORS模块实现并发简单版FTP允许多用户并发上传下载文件 必须使用select or selectors模块支持多并发,禁止使用多线程或多进程 RE ...

  4. 安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败

    安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server ...

  5. sys.argv[]使用

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得的参数可以是多个,所以获得的是一 ...

  6. Ubuntu18.04安装Tensorflow+cuda+cuDNN

    本文写的比较简单,期间遇到的一些小麻烦,自己不认为成为阻碍,所以没有详细写. 如有疑问可以联系QQ:2922530320 Pycharm Pycharm使用Anaconda Pycharm 在新建项目 ...

  7. CNTA-2019-0014 wls9-async 反序列化 rce 分析

    在调试weblogic,以前导入jar包都是在weblogic目录搜索*.jar拷贝出来在导入IDEA.有时候会出现好多相同的jar包,调试的时候就会出问题,实际上导入以下俩个包就可以了.1.是mod ...

  8. 关于mysql中字符集和排序规则说明

    文章转自 http://blog.csdn.net/smallSBoy/article/details/52997138 数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set ...

  9. MP实战系列(五)之封装方法讲解

    mybatis plus封装的方法怎么用?以及它们对应的sql是那些sql?及其什么情况用? 这些需要说下,以下我将会将我常用的说下,不是常用的,可能提以下或者不提. 根据主键查询 UserEntit ...

  10. AI 深度生成模型

    深度生成模型 1.玻尔兹曼机