windows下C#通过Thrift操作HBase

时间:2021-09-04 08:24:37

1。到apache官网下载Thrift源码, http://thrift.apache.org/download,我这里下载的是thrift-0.10.0

2。到apach官网下载thrift.exe, http://thrift.apache.org/download, 这里下载的是thrift-0.10.0.exe

3。将下载下来的thrift-0.10.0.exe放到thrift-0.10.0/tutorial/目录下去

4。在windows命令行运行如下这两条命令:

  thrift-0.10.0.exe --gen csharp tutorial.thrift

  thrift-0.10.0.exe --gen csharp shared.thrift

运行完以后就会在当前目录下生成一个名为gen-csharp的目录,到时候需要把这下面的源码文件添加到项目中去

 

5。用vs打开thrift-0.10.0/lib/csharp/src/Thrift.sln解决方案,并编译得到Thrift.dll

6。用vs新建自己的项目,将之前生成的源码添加进来,并引入Thrift.dll库。

下面就是Client端的代码

using System;
using Thrift;
using Thrift.Protocol;
using Thrift.Server;
using Thrift.Transport;

namespace CSharpTutorial
{
public class CSharpClient
{
public static void Main()
{
try
{
TTransport transport
= new TSocket("localhost", 9090);
TProtocol protocol
= new TBinaryProtocol(transport);
Calculator.Client client
= new Calculator.Client(protocol);

transport.Open();
try
{
client.ping();
Console.WriteLine(
"ping()");

int sum = client.add(1, 1);
Console.WriteLine(
"1+1={0}", sum);

Work work
= new Work();

work.Op
= Operation.DIVIDE;
work.Num1
= 1;
work.Num2
= 0;
try
{
int quotient = client.calculate(1, work);
Console.WriteLine(
"Whoa we can divide by 0");
}
catch (InvalidOperation io)
{
Console.WriteLine(
"Invalid operation: " + io.Why);
}

work.Op
= Operation.SUBTRACT;
work.Num1
= 15;
work.Num2
= 10;
try
{
int diff = client.calculate(1, work);
Console.WriteLine(
"15-10={0}", diff);
}
catch (InvalidOperation io)
{
Console.WriteLine(
"Invalid operation: " + io.Why);
}

SharedStruct log
= client.getStruct(1);
Console.WriteLine(
"Check log: {0}", log.Value);

}
finally
{
transport.Close();
}
}
catch (TApplicationException x)
{
Console.WriteLine(x.StackTrace);
}

}
}
}

下面是Server端代码

using System;
using System.Collections.Generic;
using Thrift.Server;
using Thrift.Transport;

namespace CSharpTutorial
{
public class CalculatorHandler : Calculator.Iface
{
Dictionary
<int, SharedStruct> log;

public CalculatorHandler()
{
log
= new Dictionary<int, SharedStruct>();
}

public void ping()
{
Console.WriteLine(
"ping()");
}

public int add(int n1, int n2)
{
Console.WriteLine(
"add({0},{1})", n1, n2);
return n1 + n2;
}

public int calculate(int logid, Work work)
{
Console.WriteLine(
"calculate({0}, [{1},{2},{3}])", logid, work.Op, work.Num1, work.Num2);
int val = 0;
switch (work.Op)
{
case Operation.ADD:
val
= work.Num1 + work.Num2;
break;

case Operation.SUBTRACT:
val
= work.Num1 - work.Num2;
break;

case Operation.MULTIPLY:
val
= work.Num1 * work.Num2;
break;

case Operation.DIVIDE:
if (work.Num2 == 0)
{
InvalidOperation io
= new InvalidOperation();
io.WhatOp
= (int)work.Op;
io.Why
= "Cannot divide by 0";
throw io;
}
val
= work.Num1 / work.Num2;
break;

default:
{
InvalidOperation io
= new InvalidOperation();
io.WhatOp
= (int)work.Op;
io.Why
= "Unknown operation";
throw io;
}
}

SharedStruct entry
= new SharedStruct();
entry.Key
= logid;
entry.Value
= val.ToString();
log[logid]
= entry;

return val;
}

public SharedStruct getStruct(int key)
{
Console.WriteLine(
"getStruct({0})", key);
return log[key];
}

public void zip()
{
Console.WriteLine(
"zip()");
}
}

public class CSharpServer
{
public static void Main()
{
try
{
CalculatorHandler handler
= new CalculatorHandler();
Calculator.Processor processor
= new Calculator.Processor(handler);
TServerTransport serverTransport
= new TServerSocket(9090);
TServer server
= new TSimpleServer(processor, serverTransport);

// Use this for a multithreaded server
// server = new TThreadPoolServer(processor, serverTransport);

Console.WriteLine(
"Starting the server...");
server.Serve();
}
catch (Exception x)
{
Console.WriteLine(x.StackTrace);
}
Console.WriteLine(
"done.");
}
}
}