使用.NETCore和Windows构建C客户端和服务器
立即解锁
发布时间: 2025-08-19 02:31:34 阅读量: 5 订阅数: 18 


Apache Thrift程序员指南:从入门到精通
### 使用 .NET Core 和 Windows 构建 C# 客户端和服务器
#### 1. 创建 RPC 服务器
在构建好简单的 `helloSvc` 服务存根并将其集成到共享库之后,我们可以创建一个服务器来实现该服务。在 Visual Studio 的 `helloServer` 项目中,已经有一个名为 `Program.cs` 的起始文件。为了实现这个简单示例,我们会用 Apache Thrift RPC 服务器代码替换该文件的内容。
以下是简单服务器的源代码:
```csharp
using System;
using Thrift.Transport;
using Thrift.Server;
namespace helloServer {
public class HelloHandler : helloSvc.Iface {
public string getMessage(string name) {
Console.WriteLine("Received from client: " + name);
return "Hello " + name;
}
}
class Program {
static void Main(string[] args) {
int port = 8585;
HelloHandler handler = new HelloHandler();
helloSvc.Processor proc = new helloSvc.Processor(handler);
TServerTransport trans = new TServerSocket(port, 0, true);
TServer server = new TSimpleServer(proc, trans);
Console.WriteLine("Server running on port " + port);
server.Serve();
}
}
}
```
初始的 `Program.cs` 文件包含了几个框架库的 `using` 语句,但我们的简单服务器仅需要 `System` 库。不过,我们需要使用 `Thrift.Transport` 库来指定端点传输,使用 `Thrift.Server` 库为服务构建合适的 RPC 服务器。
所有可执行代码都在默认项目命名空间 `helloServer` 中。首先定义的类是服务的处理程序 `HelloHandler`,它负责实现 `helloSvc.Iface` 接口,该接口由 IDL 编译器生成并包含在我们上一节编译的服务库中。复制生成的接口是开始编写服务处理程序的一个不错的方法。此服务定义的唯一方法 `getMessage()` 会根据传入的名称返回问候语。
在 `Main()` 函数中,我们设置并运行 RPC 服务器。要让服务器运行,第一步是为要托管的服务创建处理程序类的实例,接着需要将处理程序包装在适当的服务处理器中,以便将网络流量转换为对处理程序方法的调用。
对于这个简单的服务器,我们为 RPC 操作设置了一个典型的网络栈。为了通过 TCP 托管客户端连接,我们选择了 `TServerSocket` 传输端点。构造函数的第一个参数将服务器套接字配置为监听 TCP 端口 8585,第二个参数指定客户端超时时间,0 表示无超时,第三个参数很重要,将其设置为 `true` 可启用服务器端缓冲,为避免向网络进行多次小写入,通常应将其设置为 `true`,默认值为 `false`。
接下来,我们配置一个 Apache Thrift `TSimpleServer` 实例,使用配置好的处理器和传输来托管服务。如果未指定序列化协议,将使用 `TBinaryProtocol`。
当一切配置好后,我们可以调用服务器的 `serve()` 方法来运行服务器,这会使服务器开始监听客户端连接。当客户端连接时,服务器将使用处理器处理连接上的 RPC 调用。
此时,服务器项目有两个未解决的依赖项。第一个是对 C# Apache Thrift 库的依赖,该库包含传输和服务器类,可像在 `helloService` 项目中那样在 `helloServer` 项目中添加对 `thrift.dll` 的引用。第二个依赖项是对 `helloService` 项目的依赖,服务器依赖于 `helloSvc Processor` 和 `helloSvc.Iface` 接口。在 Visual Studio 中,右键单击 `helloServer` 项目中的“引用”项,选择“添加引用”,在“引用管理器”对话框左侧点击“解决方案”,勾选 `helloService` 项目,然后选择“确定”即可添加引用。
要构建服务器,在“解决方案资源管理器”中右键单击 `helloServer` 项目,选择“生成”,窗口底部的输出面板将报告生成 `helloServer.exe` 的路径。
#### 2. 创建 RPC 客户端
这个简单 RPC 示例的最后一步是创建一个客户端来测试服务器。在了解了前两节的大部分关键构建概念后,组装客户端相对简单。以下是可以复制到 `helloClient` 项目 `Program.cs` 文件中的简单 RPC 客户端代码:
```csharp
using System;
using Thrift.Protocol;
using Thrift.Transport;
namespace helloClient
{
class Program
{
static void Main(string[] args)
{
TTransport trans = new TSocket("localhost", 8585);
trans = new TBufferedTransport(trans as TStreamTransport);
trans.Open();
TBinaryProtocol proto = new TBinaryProtocol(trans);
helloSvc.Client client = new helloSvc.Client(proto);
string result = client.getMessage("Ginger");
Console.WriteLine("Received from server: " + result);
}
}
}
```
和服务器一样,客户端仅需要 `System .NET` 库,但依赖于 `Thrift Protocol` 和 `Thrift Transport` 库。客户端必须使用与服务器传输兼容的端点传输,因此在这个例子中我们配置了使用端口 8585 的 `TSocket`。`TBufferedTransport` 会缓冲 Apache Thrift 协议层进行的许多小写入操作,只有在整个消息准备好后才传输数据。
在 C# 中,`TSocket` 派生自 `TStreamTransport`,而 `TStreamTransport` 又派生自 `TTransport`。我们使用通用的 `TTransport` 引用保存 `TSocket`,以重用 `trans` 引用变量。但由于 `TBufferedTransport` 需要包装 `TStreamTransport`,我们必须使用 `as` 运算符将 `trans` 引用的 `TSocket` 重新解释为 `TStreamTransport`。将包装了缓冲区的套接字重新赋值给 `trans` 引用后,我们可以使用 `open()` 方法打开与服务器的连接。
为了完成客户端 I/O 栈,我们需要添加一个与目标服务器使用的协议匹配的序列化协议,这里我们创建了一个 `TBinaryProtocol` 层叠在传输栈之上。
最后一步是将 `helloSvc` 客户端层叠在协议之上。客户端对象配置好后,我们就可以开始调用 Hello 服务 IDL 中定义的服务方法了。
代码完成后,有几个未解决的依赖项。要解决这些问题,可遵循与服务器项目相同的步骤,添加对 `helloService` 项目和 Thrift 共享库的引用。引用添加好后,右键单击 `helloClient` 项目并选择“生成”以
0
0
复制全文
相关推荐









