publicclassCaloculatorServiceImplimplementsCalculator.Iface{@Overridepublicintcalculate(intlogid,Workwork)throwsInvalidOperation,TException{System.out.println("calculate("+logid+", {"+work.op+","+work.num1+","+work.num2+"})");intval=0;switch(work.op){caseADD:val=work.num1+work.num2;break;caseSUBTRACT:val=work.num1-work.num2;break;caseMULTIPLY:val=work.num1*work.num2;break;caseDIVIDE:if(work.num2==0){InvalidOperationio=newInvalidOperation();io.what=work.op.getValue();io.why="Cannot divide by 0";throwio;}val=work.num1/work.num2;break;default:InvalidOperationio=newInvalidOperation();io.what=work.op.getValue();io.why="Unknown operation";throwio;}returnval;}}
下面实现一个Server,让人们可以调用服务
DemoServer.java
12345678910111213
publicclassDemoServer{publicstaticvoidmain(String[]args)throwsTTransportException{Calculator.IfacecalculatorService=newCaloculatorServiceImpl();Calculator.Processorprocessor=newCalculator.Processor(calculatorService);TServerTransportserverTransport=newTServerSocket(8000);TServerserver=newTThreadPoolServer(newTThreadPoolServer.Args(serverTransport).processor(processor));System.out.println("Starting the simple server...");server.serve();}}
publicclassDemoClient{publicstaticvoidmain(String[]args)throwsException{TTransporttransport=newTSocket("localhost",8000);transport.open();TProtocolprotocol=newTBinaryProtocol(transport);Calculator.Ifaceclient=newCalculator.Client(protocol);Workwork=newWork();work.op=Operation.DIVIDE;work.num1=1;work.num2=0;try{intquotient=client.calculate(1,work);System.out.println("Whoa we can divide by 0");}catch(InvalidOperationio){System.out.println("Invalid operation: "+io.why);}work.op=Operation.SUBTRACT;work.num1=15;work.num2=10;try{intdiff=client.calculate(2,work);System.out.println("15-10="+diff);}catch(InvalidOperationio){System.out.println("Invalid operation: "+io.why);}transport.close();}}
importsysfromme.ellios.demoimportCalculatorfromme.ellios.demo.ttypesimport*fromthriftimportThriftfromthrift.transportimportTSocketfromthrift.transportimportTTransportfromthrift.protocolimportTBinaryProtocoltry:# Make sockettransport=TSocket.TSocket('localhost',8000)# Buffering is critical. Raw sockets are very slowtransport=TTransport.TBufferedTransport(transport)# Wrap in a protocolprotocol=TBinaryProtocol.TBinaryProtocol(transport)# Create a client to use the protocol encoderclient=Calculator.Client(protocol)# Connect!transport.open()work=Work()work.op=Operation.DIVIDEwork.num1=1work.num2=0try:quotient=client.calculate(1,work)print'Whoa? You know how to divide by zero?'exceptInvalidOperation,io:print'InvalidOperation: %r'%iowork.op=Operation.SUBTRACTwork.num1=15work.num2=10diff=client.calculate(1,work)print'15-10=%d'%(diff)# Close!transport.close()exceptThrift.TException,tx:print'%s'%(tx.message)