当前位置: 移动技术网 > IT编程>开发语言>c# > 利用thrift实现js与C#通讯的实例代码

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
1.为什么要用thrift js c#?     1.1 首先,js 通过 thrift 访问c#,实际上是一种c/s模式。thrift是通

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网