我从昨天开始学习节俭。
经过一番努力,我成功执行了Java教程。 Java 服务器和客户端运行完美。
但是现在,我想要一个 javascript 客户端与 Java Thrift 服务器通信。
为此,我移动了 js/
文件夹中的所有 js 文件。
并粘贴 index.html 代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Thrift Javascript Bindings - Tutorial Example</title>
<script src="js/thrift.js" type="text/javascript"></script>
<script src="js/tutorial_types.js" type="text/javascript"></script>
<script src="js/shared_types.js" type="text/javascript"></script>
<script src="js/SharedService.js" type="text/javascript"></script>
<script src="js/Calculator.js" type="text/javascript"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8">
//<![CDATA[
$(document).ready(function(){
// remove pseudo child required for valid xhtml strict
$("#op").children().remove();
// add operations to it's dropdown menu
$.each(Operation, function(key, value) {
$('#op').append($("<option></option>").attr("value",value).text(key));
});
$('table.calculator').attr('width', 500);
});
function calc() {
var transport = new Thrift.Transport("http://localhost:9090");
var protocol = new Thrift.Protocol(transport);
var client = new CalculatorClient(protocol);
var work = new Work()
work.num1 = $("#num1").val();
work.num2 = $("#num2").val();
work.op = $("#op").val();
try {
result = client.calculate(1, work);
$('#result').val(result);
$('#result').css('color', 'black');
} catch(ouch){
$('#result').val(ouch.why);
$('#result').css('color', 'red');
}
}
function auto_calc() {
if ($('#autoupdate:checked').val() !== undefined) {
calc();
}
}
//]]>
</script>
</head>
<body>
<h2>Thrift Javascript Bindings</h2>
<form action="">
<table class="calculator">
<tr>
<td>num1</td>
<td><input type="text" id="num1" value="20" onkeyup="javascript:auto_calc();"/></td>
</tr>
<tr>
<td>Operation</td>
<td><select id="op" size="1" onchange="javascript:auto_calc();"><option></option></select></td>
</tr>
<tr>
<td>num2</td>
<td><input type="text" id="num2" value="5" onkeyup="javascript:auto_calc();"/></td></tr>
<tr>
<td>result</td>
<td><input type="text" id="result" value=""/></td></tr>
<tr>
<td><input type="checkbox" id="autoupdate" checked="checked"/>autoupdate</td>
<td><input type="button" id="calculate" value="calculate" onclick="javascript:calc();"/></td>
</tr>
</table>
</form>
<p>This Java Script example uses <a href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=tutorial/tutorial.thrift;hb=HEAD">tutorial.thrift</a> and a Thrift server using JSON protocol and HTTP transport.
</p>
<p>
<a href="http://validator.w3.org/check/referer"><img
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0!" height="31" width="88" /></a>
</p>
</body>
</html>
我换了行
var transport = new Thrift.Transport("/thrift/service/tutorial/");
与
var transport = new Thrift.Transport("http://localhost:9090");
因为,我的服务器在端口 9090 上。/thrift/service/tutorial
对我来说没有任何意义,它也没有工作。
然后,当我打开我的页面时。
Java thrift 服务器崩溃并出现以下错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.thrift.protocol.TBinaryProtocol.readStringBody(TBinaryProtocol.java:339)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:202)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
at org.apache.thrift.server.TSimpleServer.serve(TSimpleServer.java:83)
at thrift.server.CalculatorServer.main(CalculatorServer.java:23)
这是 CalculatorServer
java 类。
package thrift.server;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;
import tutorial.Calculator;
public class CalculatorServer {
public static void main(String[] args) {
CalculatorHandler handler = new CalculatorHandler();
Calculator.Processor<CalculatorHandler> processor = new Calculator.Processor<>(handler);
try {
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
System.out.println("Starting the simple server...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
其余代码来自 Thrift 教程。事实上,Java Thrift 服务器与 Java Thrift 客户端完美配合。我认为 Java 服务器端没有任何问题。
谁能告诉我哪里出了问题?
有没有Javascript客户端的替代方案?
我正在使用 thrift 在我的 Java SE 应用程序和本地计算机上的网站之间进行通信。因此,我可以使用 HTML+CSS+JS 开发我的 GUI,而不是使用 Java Swing。
最佳答案
我一直在寻找一种在 polymer javascript 中使用 thrift 的简单方法。最后这是我花了三天时间分析其他解决方案后的解决方案。他们在工作,但他们都需要从我的 http://localhost:8088/view.html 读取 view.html 本地位置文件。要求。我发现这太贵了,因为我同时使用谷歌应用引擎和计算引擎。我无法在 App Engine 上找到本地目录,所以这就是所做的。
- 多写你的java服务器like this .
像这样写你的聚合物元素
<dom-module id="thrift-client"> <template> </template> <script> Polymer({ is:'thrift-client', ready:function(){ var transport = new Thrift.TXHRTransport("http://localhost:8088/service"); var protocol = new Thrift.TJSONProtocol(transport); var client = new NtvApiClient(protocol); var result = client.ping(); // ping the java server. custom console.log(result); } }); </script>
请确保 java 服务器有一个与 service 完全相同的检查点
太棒了,我们现在拥有从 javascript 网络客户端访问 java 服务器所需的一切,而无需提供任何文件路径。
请注意,有了这个,您可以轻松地在纯 js 中使用。像这样
var transport = new Thrift.TXHRTransport("http://localhost:8088/service"); var protocol = new Thrift.TJSONProtocol(transport); var client = new NtvApiClient(protocol); var result = client.ping();
干杯。
关于java - Thrift Java 服务器 OutOfMemoryError 与 Javascript 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21821787/