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

时间:2022-09-07 15:49:13 

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("https://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,就可以看到效果了。

标签:js,C#,通讯
0
投稿

猜你喜欢

  • Android中生成、使用Json数据实例

    2023-02-04 15:01:24
  • Unity实现苹果手机Taptic震动

    2023-02-15 07:18:47
  • Struts2+Hibernate实现数据分页的方法

    2022-10-28 05:31:13
  • Android 安全加密:数字签名和数字证书详解

    2023-07-25 21:36:46
  • Spring MVC全局异常实例详解

    2021-11-19 13:51:26
  • Flutter开发通用页面Loading组件示例详解

    2022-05-18 23:41:09
  • 简单掌握Android Widget桌面小部件的创建步骤

    2021-12-07 01:48:35
  • 详解 C# 中XML对象的序列化和反序列化

    2022-06-24 12:55:27
  • 全面了解Java中的内部类和匿名类

    2023-01-05 09:14:23
  • 详解path和classpath的区别

    2023-05-02 13:28:32
  • Java 数组获取最大和最小值的实例实现

    2021-06-18 15:53:06
  • 基于Java的guava开源库工具类

    2022-04-07 05:37:53
  • 浅析java实现数据加密问题

    2023-03-21 02:54:04
  • 浅析C#中文件路径的操作

    2023-11-09 16:24:30
  • Java界面编程实现界面跳转

    2023-11-12 00:56:45
  • c++难以发现的bug(有趣)

    2022-01-27 17:01:41
  • Android 全屏无标题栏的三种实现方法

    2022-01-05 03:01:31
  • 通过java反射机制动态调用某方法的总结(推荐)

    2022-11-04 01:38:32
  • Java多线程编程中使用Condition类操作锁的方法详解

    2023-10-19 13:30:55
  • Android 接收微信、QQ其他应用打开第三方分享功能

    2022-06-12 18:11:58
  • asp之家 软件编程 m.aspxhome.com