当前位置:  编程技术>.net/c#/asp.net

利用thrift实现js与C#通讯的实例代码

    来源: 互联网  发布时间:2014-10-18

    本文导语:  1.为什么要用thrift js C#?     1.1 首先,js 通过 thrift 访问C#,实际上是一种c/s模式。thrift是通信工具,js是客户端,C#是服务端。     1.2 使用js直接与thrift server通信。让web开发变得更简单。如果使用Web Service,你需要自己去实...

1.为什么要用thrift js C#?

    1.1 首先,js 通过 thrift 访问C#,实际上是一种c/s模式。thrift是通信工具,js是客户端,C#是服务端。

    1.2 使用js直接与thrift server通信。让web开发变得更简单。如果使用Web Service,你需要自己去实现C/S两端的序列化与反序列化操作,还需要自行处理异常,降低了开发效率。而thrift则会自动生成两端的操作类,你只需要处理方法内部的逻辑即可。

    1.3 js直接与thrift server通信,可以提高性能,并且用C#开发server,开发效率也非常高。(那些web service弱爆了)

    1.4 当然,我们不能只看到优点。用这种方法也有比较明显的缺点:如果使用web service,则网页与web service可以封装在一个工程里,部署到IIS上后,可以存在于一个网站内。而使用了thrift后,你还需要手动管理thrift程序。包括:

        1.4.1 你需要拥有服务端的绝对控制权,比如,你可以直接登录服务器的操作系统上进行操作。因此,如果你只有一个网页空间,则不适合这种方法。当然,你也可以用web service里绑定thrift,但这样你又需要自己手动进行序列化与反序列操作,而且两次转换让性能更低,有违初衷

        1.4.2 给thrift server程序增加自动启动,与监视程序,来完成thrift的崩溃后自动重启。

 

2.环境

    Win7 - VS2012 - .net 4.0 C# 控制台工程(用来承载thrift)

    Win7 - VS2012 - .net 4.0 C# Web工程(用来调试js,超方便)

 

3.步骤(以下步骤,对于小白来说,有些困难。QQ讨论群:23152359 )

    3.1 去thrift官方下载thrift库,目前是0.9.0。

    3.2 去thrift官方下载编译好的win下的thrift编译器,是一个exe文件。

    3.3 写一个数据结构定义文件。我在这里只是用了服务,没有定义自定义数据结构。

        data.txt:

代码如下:

 service UserStorage
 {
     i32 Sum( 1: i32 arg_number1, 2: i32 arg_number2),
     string GetString()
 }

3.4 命令行下,用thrift编译器,对它进行编译:
   run.bat:
代码如下:

 thrift-0.9.0.exe --gen csharp data.txt
 thrift-0.9.0.exe --gen js data.txt
 pause

    3.5 建立一个名字为CSharpServer的C#控制台工程,.net 4.0的。

    3.6 为这个工程,添加现有项目:thrift库目录thrift-0.9.0libcsharpsrcThrift.csproj,然后引用这个项目。

    3.7 把thrift编译出来的UserStorage.cs(在gen-csharp目录里),拖动到解决方案管理器里的CSharpServer项目的根目录下,UserStorage.cs与Program.cs应该在同一级。

    3.8 在CSharpServer项目里创建一个UserStorage的处理类UserStorageHandle.cs:(它应该与UserStorage.cs与Program.cs在同一级)

代码如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

 namespace CSharpServer
 {
     public class UserStorageHandle : UserStorage.Iface
     {

         public UserStorageHandle()
         {

         }

         public int Sum(int arg_number1, int arg_number2)
         {
             int result = arg_number1 + arg_number2;
             Console.WriteLine(DateTime.Now.ToString() + " 收到请求:Sum,参数:arg_number1 = " + arg_number1.ToString() + ",arg_number2 = " + arg_number2.ToString() + ",返回:result = " + result.ToString());
             return result;
         }

         private static int Counter = 0;

         public string GetString()
         {
             int currentCounter = System.Threading.Interlocked.Increment(ref UserStorageHandle.Counter);
             Console.WriteLine(DateTime.Now.ToString() + " 收到请求:GetString,参数:没有,返回:result = "thrift is OK : " + currentCounter.ToString() + """);
             return "thrift is OK : " + currentCounter.ToString();
         }

     }
 }

    3.9 主程序Program.cs:

代码如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using Thrift.Transport;
 using Thrift.Protocol;
 using Thrift.Server;
 using System.Net;

 namespace CSharpServer
 {
     class Program
     {
         private static HttpListener httpListener = null;
         private static THttpHandler httpServer = null;

         static void Main(string[] args)
         {
             string serviceUrl = "http://localhost:99/";
             try
             {
                 UserStorageHandle handle = new UserStorageHandle();
                 UserStorage.Processor processor = new UserStorage.Processor(handle);
                 TProtocolFactory protocolFactory = new TJSONProtocol.Factory();

                 Program.httpServer = new THttpHandler(processor, protocolFactory);

                 Program.httpListener = new HttpListener();
                 Program.httpListener.Prefixes.Add(serviceUrl);
                 Program.httpListener.Start();
                 IAsyncResult result = Program.httpListener.BeginGetContext(new AsyncCallback(WebRequestCallback), null);
                 Console.WriteLine("Thrift 服务成功启动,网址是 " + serviceUrl);
             }
             catch (System.Exception ex)
             {
                 Console.WriteLine("发生错误:" + ex.Message);
                 Console.WriteLine("按回车键退出");
                 Console.ReadLine();
                 return;
             }
             Console.WriteLine("若需结束程序,请直接关闭窗口,或按回车。");
             Console.ReadLine();
         }

         public static void WebRequestCallback(IAsyncResult result)
         {
             if (Program.httpListener == null)
             {
                 Console.WriteLine("发生错误:HttpListener已经被关闭");
                 Console.WriteLine("按回车键退出");
                 Console.ReadLine();
                 return;
             }

             HttpListenerContext httpListenerContext = Program.httpListener.EndGetContext(result);

             Program.httpListener.BeginGetContext(new AsyncCallback(WebRequestCallback), null);

             Program.httpServer.ProcessRequest(httpListenerContext);
         }

     }
 }

    3.10 按F5,启动CSharpServer项目。

    3.11 新开一个VS2012(内存不够的赶快去买),建立一个叫JsProject的C# .net 4.0 Web空工程。

    3.12 去jquery官网下载jquery-1.9.1.js(mini版也行,随便)

    3.13 把thrift编译的js文件data_types.js与UserStorage.js,thrift库的js库文件(thrift库目录thrift-0.9.0libjsthrift.js),以及刚下载的jq文件jquery-1.9.1.js,全部拖动到解决方案资源管理器的JsProject项目的根目录下:

        data_types.js jquery-1.9.1.js thrift.js UserStorage.js 应该与Web.config在同一级。

    3.14 在根目录下创建一个Test.html文件,Test.html 应该与Web.config在同一级:

            Test.html:

代码如下:


 
 
 
    
    
    
    
    

    
         $(document).ready(function ()
         {
             var debugPosation = 0;
             try
             {
                 var transport = new Thrift.Transport("http://www./");
                 var protocol = new Thrift.Protocol(transport);
                 var client = new UserStorageClient(protocol);

                 var result_GetString = client.GetString();
                 var result_Sum = client.Sum(255, 322);
             }
             catch (e)
             {
                 alert("出错鸟:" + e.message);
             }
         });
    
 
 
 
 

    3.15 给Test.html的 “ var debugPosation = 0; ” 这一行,下断点,然后F5,就可以看到效果了。


    
 
 

您可能感兴趣的文章:

  • C#利用反射来判断对象是否包含某个属性的实现方法
  • C# 利用StringBuilder提升字符串拼接性能的小例子
  • C#利用Windows自带gdi32.dll实现抓取屏幕功能实例
  • C# 利用Aspose.Words.dll将 Word 转成PDF
  • C#利用com操作excel释放进程的解决方法
  • C# 中如何利用lambda实现委托事件的挂接
  • C#利用System.Threading.Thread.Sleep即时输出信息的详解
  • C#利用ODP.net连接Oracle数据库的操作方法
  • c#利用Grahics进行图片裁剪
  • 怎么利用c#修改services的Startup type
  • C#利用Openxml读取Excel数据实例
  • c#利用Excel直接读取数据到DataGridView
  • C#利用子线程刷新主线程分享教程
  • C#中利用代理实现观察者设计模式详解
  • c#利用webmail邮件系统发送邮件示例分享
  • c#中利用委托反射将DataTable转换为实体集的代码
  • C#利用XML创建Excel文档的实现方法
  • c#利用system.net发送html格式邮件
  • Android利用方向传感器获得手机的相对角度实例说明 iis7站长之家
  • 利用C#实现分布式数据库查询
  • Java利用for循环输出空心菱形的实例代码
  • 如何使用利用RTTI创建的对象实例??
  • 利用python获得时间的实例说明
  • python利用hook技术破解https的实例代码
  • Android简单的利用MediaRecorder进行录音的实例代码
  • 利用soaplib搭建webservice详细步骤和实例代码
  • Android利用方向传感器获得手机的相对角度实例说明
  • Android利用ViewPager实现滑动广告板实例源码
  • asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁知道linux/unix下利用Schema读取校验xml的开源代码,给一个链接,谢谢!
  • 怎样利用JAVABEAN将JSP页面提交的数据保存到数据库,请给代码好吗?谢谢!
  • linux c编写的利用cmpp发送短信的源代码
  • asp.net中利用正则表达式判断一个字符串是否为数字的代码
  • unix下如何利用core文件找到产生它的具体程序及产生错误的代码位置
  • 利用MySQL函数实现判断视频扩展名的代码
  • python利用elaphe制作二维条形码实现代码
  • 菜鸟问题:请大家用简单的代码描述一下,如何利用接口实现多重继承!
  • 利用jQuary实现文字浮动提示效果示例代码
  • 用户态代码性能提高的问题,如何让出CPU利用率??
  • 利用sql函数生成不重复的订单号的代码
  • ThinkPHP框架任意代码执行漏洞的利用及其修复方法
  • JAVA (Jsp)利用Google的Translate开发API的代码
  • 哪位能提供一段收pop3邮件的代码?利用javamail工具包就行了。
  • java利用htmlparser获取html中想要的代码具体实现
  • 有jsp~javabean的关于如何接收email的代码吗?利用他人的邮件服务器(smtp:163.com)收发邮件
  • 利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
  • java中怎样实现利用socket编写收邮件的代码
  • linux c下利用srand和rand函数生成随机字符串
  • 请问:Linux下用C编程计算CPU利用率和内存利用率?
  • linux下利用(cat,strings,head,sed)命令生成随机字符串
  • 在2003下利用vmware安装了linux,又利用host-only方式上了网,问题如下多谢指点!!!
  • Web前端开发如何利用css样式来控制Html中的h1/h2/h3标签不换行
  • 大虾 紧急求助!!!!如何求得当前机子的处理器利用率和内存利用率?
  • 如何利用libpcap和Python嗅探数据包
  • 如何利用Bash脚本(利用awksedgrepwc等)来自动修改配置文件
  • windows堆栈溢出利用的七种方式
  • 求RADIUS的动态分配IP的问题(利用IPPOOL)
  • iowait和cpu利用率的权衡问题
  • 利用java.net.URLConnection上传文件
  • Qt中利用槽如何来传递参数


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3