如何将zipoutputstream返回_Thrift总结(二)如何快速创建自己的RPC服务

前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口。不清楚的可以看这个《Thrift总结(一)介绍》。做好之前的准备工作以后,下面就开始如何用Thrift写RPC接口。

  如何用Thrift写RPC接口

  1. 打开之前下载的thrift 源码,thrift-0.10.0libcsharpsrc ,编译生成Thrift.dll 文件。

d06c068dfae963007b23521b30639fe5.png

  2. 新建一个空白解决方案命名为HelloThrift。在解决方案根目录下创建一个lib文件夹,将刚刚生成的Thrift.dll文件放入lib文件夹中。在解决方案分中建立两个控制台程序和一个类库,控制台程序分别命名为HelloThrift.Client 和 HelloThrift.Server,类库命名为Thrift.Interface。Client、Server和Interface分别引用lib文件夹中的Thrift.dll文件,将准备工作中生成的HelloService文件导入到Interface类库中。Client和Server分别引用Interface。具体结果如下图所示

bf95490247bfa97f5a3caf18585a9168.png

  3. 创建完相关的项目和引用之后,在服务端HelloThrift.Server 创建一个类命名为MyHelloService,实现HelloService.Iface接口,代码如下:

  清单1.MyHelloService

using System;using HelloThrift.Interface;namespace HelloThrift.Server{    public class MyHelloService : HelloService.Iface    {        ///         /// 只有一个参数返回值为字符串类型的方法        ///         /// string类型参数        /// 返回值为string类型        public string HelloString(string para)        {            System.Threading.Thread.Sleep(1 * 1000);            Console.WriteLine("客户端调用了HelloString方法");            return para;        }        ///         /// 只有一个参数,返回值为int类型的方法        ///         ///         /// 返回值为int类型        public int HelloInt(int para)        {            System.Threading.Thread.Sleep(1 * 1000);            Console.WriteLine("客户端调用了HelloInt方法");            return para;        }        ///         /// 只有一个bool类型参数,返回值为bool类型的方法        ///         ///         /// 返回值为bool类型        public bool HelloBoolean(bool para)        {            System.Threading.Thread.Sleep(1 * 1000);            Console.WriteLine("客户端调用了HelloBoolean方法");            return para;        }        ///         /// 返回执行为空的方法        ///         public void HelloVoid()        {            System.Threading.Thread.Sleep(1 * 1000);            Console.WriteLine("客户端调用了HelloVoid方法");            Console.WriteLine("HelloWorld");        }        ///         /// 无参数,返回值为null的方法        ///         /// 返回值为null        public string HelloNull()        {            System.Threading.Thread.Sleep(1 * 1000);            Console.WriteLine("客户端调用了HelloNull方法");            return null;        }    }}
49958616c0657b5ebadac00b5ce03a3e.gif

  4. 创建服务器端HelloThrift.Server 宿主的实现代码,在Program.cs 中添加如下代码,这样一个thrift 服务器就创建好了。

  清单2.HelloThrift.Server

using System;using Thrift;using Thrift.Protocol;using Thrift.Server;using Thrift.Transport;using HelloThrift.Interface;namespace HelloThrift.Server{    class Program    {        static void Main(string[] args)        {            try            {                //设置服务端口为8080                TServerSocket serverTransport = new TServerSocket(9081);                //设置传输协议工厂                TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory();                //关联处理器与服务的实现                TProcessor processor = new HelloService.Processor(new MyHelloService());                //创建服务端对象                TServer server = new TThreadPoolServer(processor, serverTransport, new TTransportFactory(), factory);                Console.WriteLine("服务端正在监听9081端口");                server.Serve();            }            catch (TTransportException ex)//捕获异常信息            {                //打印异常信息                Console.WriteLine(ex.Message);            }        }    }}

  5. 创建完服务端之后,下面开始生成一个客户端实现代码,在HelloThrift.Client 的 Program.cs 中添加如下代码:

  清单3.HelloThrift.Client

using System;using HelloThrift.Interface;using Thrift.Protocol;using Thrift.Transport;namespace HelloThrift.Client{    class Program    {        static void Main(string[] args)        {            try            {                //设置服务端端口号和地址                TTransport transport = new TSocket("localhost", 9081);                transport.Open();                //设置传输协议为二进制传输协议                TProtocol protocol = new TBinaryProtocol(transport);                //创建客户端对象                HelloService.Client client = new HelloService.Client(protocol);                //调用服务端的方法                Console.WriteLine(client.HelloString("HelloThrift"));                Console.ReadKey();            }            catch (TTransportException e)            {                Console.WriteLine(e.Message);            }        }    }}

  上面的代码调用了服务端的HelloString方法,服务端也会返回传入的传输值,客户端将服务端返回的数据打印出来。好了完成了代码以后,将先启动Server,在启动Client。客户端调用结果 和 服务端请求显示。

dcd4b93956a7cf4bb3b47044f60a10aa.png

  说明

  1. 关于使用Thrift 构建我们自己的rpc 的方法,这里基本讲完了。其他的方法本文就不再演示了,调用起来都是一样。

  2. 后续会简单讨论一下Thrift 框架的通信原理。

  3. 源代码下载,HelloThrift.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用ZipOutputStream实现直接返回前端下载的示例代码: ```csharp using ICSharpCode.SharpZip.Zip; using System.IO; using System.Web.Mvc; public ActionResult DownloadFiles() { // 假设我们有一个文件列表 List<FileModel> fileList = new List<FileModel>(); fileList.Add(new FileModel { FilePath = "C:\\file1.txt", FileName = "file1.txt" }); fileList.Add(new FileModel { FilePath = "C:\\file2.txt", FileName = "file2.txt" }); fileList.Add(new FileModel { FilePath = "C:\\file3.txt", FileName = "file3.txt" }); // 创建一个内存流,用于存储压缩后的文件 MemoryStream ms = new MemoryStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(ms); // 设置压缩级别 zipOutputStream.SetLevel(9); // 遍历文件列表,将每个文件添加到压缩包中 foreach (var file in fileList) { // 打开文件流 FileStream fs = new FileStream(file.FilePath, FileMode.Open, FileAccess.Read); // 创建一个新的ZipEntry对象 ZipEntry entry = new ZipEntry(file.FileName); // 将ZipEntry对象添加到压缩流中 zipOutputStream.PutNextEntry(entry); // 将文件流写入压缩流中 byte[] buffer = new byte[4096]; int bytesRead; do { bytesRead = fs.Read(buffer, 0, buffer.Length); zipOutputStream.Write(buffer, 0, bytesRead); } while (bytesRead > 0); // 关闭文件流 fs.Close(); } // 关闭压缩流 zipOutputStream.Finish(); zipOutputStream.Close(); // 将压缩后的文件写入Response中,实现直接返回前端下载 Response.Clear(); Response.ContentType = "application/zip"; Response.AddHeader("Content-Disposition", "attachment; filename=files.zip"); Response.BinaryWrite(ms.ToArray()); Response.End(); return null; } ``` 在上述代码中,我们首先创建了一个内存流,用于存储压缩后的文件。然后,我们创建了一个ZipOutputStream对象,并将其与内存流关联起来。接着,我们遍历文件列表,将每个文件添加到压缩包中。最后,我们将压缩后的文件写入Response中,实现直接返回前端下载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值