2、输入编译命令,将接口文件编译相应的语言java、nodejs。
>thrift -r --gen java tutorial.thrift
>thrift
-r --gen js:node tutorial.thrift
3、能够在当前文件夹下看到相应生成的文件夹gen-java、gen-nodejs;
4. 创建Java语言的server
1、在eclipse新建MavenProject名为thrift
2、创建CalculatorHandler.java和JavaServer.java文件。代码例如以下:
CalculatorHandler.java
package tutorial.impl;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
* file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
import java.util.HashMap;
import shared.SharedStruct;
// Generated code
import tutorial.Calculator;
import tutorial.InvalidOperation;
import tutorial.Work;
public class CalculatorHandler implements Calculator.Iface {
private HashMap log;
public CalculatorHandler() {
log = new HashMap();
}
public void ping() {
System.out.println("ping()");
}
public int add(int n1, int n2) {
System.out.println("add(" + n1 + "," + n2 + ")");
return n1 + n2;
}
public int calculate(int logid, Work work) throws InvalidOperation {
System.out.println("calculate(" + logid + ", {" + work.op + "," + work.num1 + "," + work.num2 + "})");
int val = 0;
switch (work.op) {
case ADD:
val = work.num1 + work.num2;
break;
case SUBTRACT:
val = work.num1 - work.num2;
break;
case MULTIPLY:
val = work.num1 * work.num2;
break;
case DIVIDE:
if (work.num2 == 0) {
InvalidOperation io = new InvalidOperation();
io.whatOp = work.op.getValue();
io.why = "Cannot divide by 0";
throw io;
}
val = work.num1 / work.num2;
break;
default:
InvalidOperation io = new InvalidOperation();
io.whatOp = work.op.getValue();
io.why = "Unknown operation";
throw io;
}
SharedStruct entry = new SharedStruct();
entry.key = logid;
entry.value = Integer.toString(val);
log.put(logid, entry);
return val;
}
public SharedStruct getStruct(int key) {
System.out.println("getStruct(" + key + ")");
return log.get(key);
}
public void zip() {
System.out.println("zip()");
}
}
3.JavaServer文件代码
package Server;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
* file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TSSLTransportFactory;
import org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
// Generated code
import tutorial.Calculator;
import tutorial.impl.CalculatorHandler;
public class JavaServer {
public static CalculatorHandler handler;
public static Calculator.Processor processor;
public static void main(String[] args) {
try {
handler = new CalculatorHandler();
processor = new Calculator.Processor(handler);
Runnable simple = new Runnable() {
public void run() {
simple(processor);
}
};
Runnable secure = new Runnable() {
public void run() {
secure(processor);
}
};
new Thread(simple).start();
new Thread(secure).start();
} catch (Exception x) {
x.printStackTrace();
}
}
public static void simple(Calculator.Processor processor) {
try {
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
// Use this for a multithreaded server
// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
System.out.println("Starting the simple server...");
server.serve();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void secure(Calculator.Processor processor) {
try {
/*
* Use TSSLTransportParameters to setup the required SSL parameters. In this example we are setting the keystore
* and the keystore password. Other things like algorithms, cipher suites, client auth etc can be set.
*/
TSSLTransportParameters params = new TSSLTransportParameters();
// The Keystore contains the private key
params.setKeyStore("c:/.mykeystore", "jinking", null, null);
/*
* Use any of the TSSLTransportFactory to get a server transport with the appropriate SSL configuration. You can
* use the default settings if properties are set in the command line. Ex: -Djavax.net.ssl.keyStore=.keystore and
* -Djavax.net.ssl.keyStorePassword=thrift
*
* Note: You need not explicitly call open(). The underlying server socket is bound on return from the factory
* class.
*/
TServerTransport serverTransport = TSSLTransportFactory.getServerSocket(9091, 0, null, params);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
// Use this for a multi threaded server
// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
System.out.println("Starting the secure server...");
server.serve();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、配置须要的lib类库。编辑pom.xml文件,必备的类库有libthrift和slf4j-api
org.apache.thrift
libthrift
0.9.2
org.slf4j
slf4j-api
1.6.1
org.slf4j
log4j-over-slf4j
1.6.1
5、用java文件夹下的keytool生成证书;
>keytool -certreq -keyalg RSA -alias myalias -file certreq.txt -keystore c:\.mykeystore
代码对应的改动成你生成的秘钥,红色字体标出;
params.setKeyStore("c:/.mykeystore", "jinking", null, null);
6、执行javaServer.java文件,能够看到例如以下界面;
5. 创建nodejs版的client
1、首先就是要搭建nodejs环境和npm和express、安装相应模块。这个能够去网上搜索一下。不在此叙述。
可能会报错:Error: Cannot find module 'thrift' 和 Error: Cannot find module 'node-int64' 、Error: Cannot find module 'q'
则须要输入以下的文件夹安装相应的模块:
npm install -g node-int64 和 npm install -g thrift 、 npm install -g q
2、新建project文件夹client;
3、讲lib下的nodejs类库和gen-nodejs,复制到根文件夹下。路径例如以下:
4、创建NodeClient.js文件
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var thrift = require('./thrift');
var ThriftTransports = require('./thrift/transport');
var ThriftProtocols = require('./thrift/protocol');
var Calculator = require('./gen-nodejs/Calculator');
var ttypes = require('./gen-nodejs/tutorial_types');
transport = ThriftTransports.TBufferedTransport()
protocol = ThriftProtocols.TBinaryProtocol()
var connection = thrift.createConnection("localhost", 9090, {
transport : transport,
protocol : protocol
});
connection.on('error', function(err) {
assert(false, err);
});
// Create a Calculator client with the connection
var client = thrift.createClient(Calculator, connection);
client.ping(function(err, response) {
console.log('ping()');
});
client.add(1,1, function(err, response) {
console.log("1+1=" + response);
});
work = new ttypes.Work();
work.op = ttypes.Operation.DIVIDE;
work.num1 = 1;
work.num2 = 0;
client.calculate(1, work, function(err, message) {
if (err) {
console.log("InvalidOperation " + err);
} else {
console.log('Whoa? You know how to divide by zero?');
}
});
work.op = ttypes.Operation.SUBTRACT;
work.num1 = 15;
work.num2 = 10;
client.calculate(1, work, function(err, message) {
console.log('15-10=' + message);
client.getStruct(1, function(err, message){
console.log('Check log: ' + message.value);
//close the connection once we're done
connection.end();
});
});
5、输入:>node NodeClient.js
6、nodejsclient命令行窗体显示:
7、Javaserver端显示:
8、大功告成。
使用thrift框架实现了Java和nodejs之间的跨平台通信;