这一篇是将Android和C#实现Thrift服务端和客户端中C#部分单独拆分开来的,方便不需要Android的开发者使用。
编写Thrift文件
写个简单的,有输入参数,无返回值,文件命名为 HelloWorld.thrift
service HelloWorldService{
void SayHello(1:string msg);
}
根据Thrift文件生成对应的C#和java文件,生成的C#和java都只有一个文件。
可以看到我用的是Thrift 0.10.0版本
C# Thrift服务端和客户端实现,并实现消息发送及接收
创建一个WinForm应用程序,命名为Thrift_HelloWorld_Csharp。
将生成的C#文件拷到项目中,并包含在项目里。在Nuget中添加thrift-csharp的引用,0.10.0版本的。
目录结构如图:
最后要实现的效果是:当前程序启动一个Thrift服务,并且能通过当前程序调用Thrift Client发送消息到服务端。
效果如下:
点击【启动】即可启动C#服务端,填写完正确的端口号,点击【发送】即可完成消息发送,因为是在本机测试,所以Ip地址固定为127.0.0.1。输入Android映射出来的端口号即可完成与Android服务端通信。
Thrift Server 代码:
public class HelloWorldServer : HelloWorldService.Iface
{
public static void Run(int port)
{
HelloWorldServer client = new HelloWorldServer();
HelloWorldService.Processor processor = new global::HelloWorldService.Processor(client);
TServerTransport transport = new TServerSocket(port);
TServer server = new TThreadPoolServer(processor, transport);
Console.WriteLine("Starting the server...");
server.Serve();
transport.Close();
}
public void SayHello(string msg)
{
Console.WriteLine(string.Format("{0:yyyy/MM/dd hh:mm:ss} {1}", DateTime.Now, msg));
}
}
调用Run方法即可启动Thrift服务,需另开一个线程运行此方法才不会阻塞下面的功能。
Thrift Client发送消息至服务端代码:
public static class HelloWorldClient
{
public static void Say(int port, string msg, string ip = "127.0.0.1")
{
TTransport transport = new TSocket(ip, port);
TProtocol protocol = new TBinaryProtocol(transport);
HelloWorldService.Client client = new HelloWorldService.Client(protocol);
transport.Open();
try
{
client.SayHello(msg);
}
catch (TApplicationException x)
{
Console.WriteLine(x.StackTrace);
}
finally
{
transport.Close();
}
}
}
调用Say方法即可实现消息发送。当将port设置为服务端端口号时即可实现发送消息至当前服务端。
就是这么简单。
源码地址:
C#实现的Thrift服务端与客户端