使用Javascript客户端的Thrift Java服务器OutOfMemoryError

我昨天开始学习节俭。

经过大量的努力,我成功地执行了Java教程。 Java服务器和客户端运行正常。

但现在,我想要一个javascript客户端与Java Thrift服务器进行通信。

为此,我将所有js文件移动到js/文件夹中。

并粘贴index.html代码如下:

     Thrift Javascript Bindings - Tutorial Example        //<![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($("").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(); } } //]]>    

Thrift Javascript Bindings

num1
Operation
num2
result
autoupdate

This Java Script example uses tutorial.thrift and a Thrift server using JSON protocol and HTTP transport.

Valid XHTML 1.0!

我换了线

 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 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 Server端没有任何问题。

任何人都可以说出了什么问题?

Javascript客户端有什么替代方案吗?

我正在使用thrift在我的Java SE应用程序和本地计算机上的网站之间进行通信。 所以,我可以使用HTML + CSS + JS开发我的GUI,而不是使用Java Swing。

我一直在寻找一种简单的方法来使用聚合物javascript里面的节俭。 最后,这是我用三天时间分析其他解决方案之后的解决方案。 他们在哪里工作,但他们都需要从我的http:// localhost:8088 / view.html请求中读取view.html本地位置文件。 我发现这很昂贵,因为我同时使用谷歌应用程序引擎和计算引擎。 我无法在应用程序引擎上找到本地目录,所以这就是做了什么。

  1. 写你的java服务器就像这样 。
  2. 像这样写你的聚合物元素

        

  3. 请注意, http:// localhost可以更改为http:// Your_server_ip_address 。

  4. 请确保java服务器有一个确切命名为服务的检查点

  5. bravo,我们现在可以从javascript Web客户端访问java服务器,而无需提供任何文件路径。

  6. 请注意,有了这个,你可以很容易地使用普通的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(); 

    干杯。

默认的“TTransport”不是基于http协议的服务器。 如果你想使用http作为通信协议,这似乎是客户端js的唯一方法,你应该使用基于http的’TTransport’。 看看’org.apache.thrift.server.TServlet’,这是在servlet中构建基于http的thrift服务器的简单方法。

您还应该在服务器端使用’TJSONProtocol’而不是’TBinaryProtocol’,因为thrift js无法很好地处理二进制数据。 这是我以前用过的代码片段。

 public class CalculatorServlet extends TServlet { public CalculatorServlet() { //'Calculator' is the generated class from thrift, //'CalculatorHandler' is the implement class for thrift rpc super(new Calculator.Processor( new CalculatorHandler()), new TJSONProtocol.Factory()); } } 

IIRC,JavaScript仅支持JSON协议。 这(当然)与二进制文件不兼容。

因此, 解决方案是:在服务器中使用JSON协议而不是二进制协议

Thrift的一个好的经验法则是, 总是在两端使用相同的传输/协议栈 。 在这个特殊情况下,这意味着:

  • HTTP服务器
  • JSON协议
  • 没有额外的framed协议(缓冲将工作,顺便说一句)

(有一些例外,因为某些服务器类型本质上需要框架,但这是另一个故事并且与您的问题无关)