zoukankan      html  css  js  c++  java
  • thrift实现js与C#通讯

    利用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库目录 hrift-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库目录 hrift-0.9.0libjs hrift.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,就可以看到效果了。

  • 相关阅读:
    Python3之random模块常用方法
    Go语言学习笔记(九)之数组
    Go语言学习笔记之简单的几个排序
    Go语言学习笔记(八)
    Python3之logging模块
    Go语言学习笔记(六)
    123. Best Time to Buy and Sell Stock III(js)
    122. Best Time to Buy and Sell Stock II(js)
    121. Best Time to Buy and Sell Stock(js)
    120. Triangle(js)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4223555.html
Copyright © 2011-2022 走看看