nodejs thrift java_使用thrift实现了Javaserver和nodejsclient之间的跨平台通信

2、输入编译命令,将接口文件编译相应的语言java、nodejs。

>thrift -r --gen java tutorial.thrift

>thrift

-r --gen js:node tutorial.thrift

3、能够在当前文件夹下看到相应生成的文件夹gen-java、gen-nodejs;

475583b011b5d5c055117cffd87bf6e0.png    

Center

ee775928f7de88da35c671e73c64ec17.png

4. 创建Java语言的server

1、在eclipse新建MavenProject名为thrift

bd0f2b87f1bdb6a5d007b507bde1e275.png

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文件,能够看到例如以下界面;

267338ccba49e09ee3ff80f20f987021.png

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,复制到根文件夹下。路径例如以下:

c2329b150ba6d790e7c882b76822ec88.png

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命令行窗体显示:

94070ba9380bbb51c0de56753dfbcd45.png

7、Javaserver端显示:

4db2edc5d213a207933e5feace844361.png

8、大功告成。

使用thrift框架实现了Java和nodejs之间的跨平台通信;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值