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

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.0\lib\csharp\src\Thrift.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.0\lib\js\thrift.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:

复制代码代码如下:
<!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title></title>
     <script type="text/javascript" src="jquery-1.9.1.js"></script>
     <script type="text/javascript" src="data_types.js"></script>
     <script type="text/javascript" src="thrift.js"></script>
     <script type="text/javascript" src="UserStorage.js"></script>

<script>
         $(document).ready(function ()
         {
             var debugPosation = 0;
             try
             {
                 var transport = new Thrift.Transport("http://www.jb51.net/");
                 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);
             }
         });
     </script>
 </head>
 <body>
 </body>
 </html>

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

thrift实现js与C#通讯的更多相关文章

  1. Node.js使用TCP通讯

    原文地址:https://www.cnblogs.com/ay-a/p/9822057.html Node.js 的 net 模块可以方便的创建TCP 服务,,以下是使用 net 模块创建的tcp 服 ...

  2. Node.js使用UDP通讯

    Node.js 的 dgram 模块可以方便的创建udp服务,,以下是使用 dgram模块创建的udp服务和客户端的一个简单例子. 一.创建 UDP Server var dgram = requir ...

  3. vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据

    vue组件是相互独立的,如果要交互通讯,这时候,就需要组件之间数据互通了 往常我们讲的都是数据传递,子传父,父传子,都没有说子和父,父与子之间的数据互通 父亲传递给儿子数据,儿子触发一个父亲方法,将最 ...

  5. thrift js javascript C# Csharp webservice

    http://www.cnblogs.com/xxxteam/archive/2013/04/15/3023159.html 利用thrift实现js与C#通讯的例子 关键字:thrift js ja ...

  6. C#进程间通讯或同步的框架引荐

    这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下  0.背景简介 微软在 .NET 框架中提供了多种实用 ...

  7. 基于thrift的node.js rpc服务

    1.在node.js 服务下创建node_modules文件,npm install  thrift 下载thrift到该文件下. 2.编写idl文件.user.thrift 内容如下: struct ...

  8. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  9. node(thrift)

    thrift是一种跨语言的RPC框架,据说uber采在node.js项目中采用thrfit后,比原有的http+json的方式提高近20倍的性能. 所谓的RPC本质上就是客户端将需要调用的方法名和参数 ...

随机推荐

  1. SQL Server高可用——日志传送(4-2)——部署

    原文:SQL Server高可用--日志传送(4-2)--部署 前文再续,书接上一回.本章演示一下日志传送的具体过程 准备工作: 由于时间关系,已经装好了3台虚拟机,且同在一个域里面: SQL01:主 ...

  2. Objective-C路成魔【2-Objective-C 规划】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 编译执行O ...

  3. 2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景.磁盘有 ...

  4. Cookie和Session (转)

    Session和Cookie在网站开发中是用来保存用户与后端服务器的交互状态.它们有各自的缺点和优点.而且,他们的优点和应用场景是对立的.   Cookie 完整地描述:当一个用户通过HTTP访问一个 ...

  5. Behavioral模式之Observer模式

    1.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并被自己主动更新. 2.别名 依赖(dependents).公布-订阅(Publish-Subscr ...

  6. Git协作流程(转)

    Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的流程,让大家有效地合作,使得项目井井有条地发展下去."协作流程"在英语里,叫做"workflo ...

  7. Maven: NoClassDefFoundError: org/codehaus/plexus/classworlds/launcher/Launcher

    为了和团队开发环境保持一致,须要 在Ubuntu上安装maven2.2.1,引文我之前已经用apt-get命令安装了3.3的maven.在运行maven命令时报错: Maven: NoClassDef ...

  8. Matlab与.NET混合编程解决人脸识别问题

    原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...

  9. Ajax.BeginForm的异步提交数据 简介

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  10. Asp.Net实现FORM认证的一些使用技巧

    原文转发:http://www.cnblogs.com/Showshare/archive/2010/07/09/1772886.html 最近因为项目代码重构需要重新整理用户登录和权限控制的部分,现 ...