我在javascript中有以下Thrift客户端代码:
<script language="javascript" type="text/javascript" src="thrift.js" />
<script language="javascript" type="text/javascript" src="QuantSvc_types.js" />
<script language="javascript" type="text/javascript" src="QuantSvc.js" />
<script language="javascript" type="text/javascript">
function calc() {
var transport = new Thrift.Transport("http://localhost:9997/QuantSvc/");
var protocol = new Thrift.Protocol(transport);
var client = new QuantSvcClient(protocol);
try {
result = client.ListAllVariables()
} catch(ouch) {
alert("An exception occurred!")
}
}
</script>
当我在HTML页面上按下按钮时会触发该操作。然后,我有以下服务器端Scala代码,在localhost:9997上运行:
object Application extends App {
val handler = new QuantSvcHandler()
val processor = new QuantSvc.Processor(handler)
val serverTransport = new TServerSocket(9997)
val server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor))
}
QuantSvcHandler的ListAllVariables函数(基本上是一个骨架函数,只是试图让事情发挥作用):
override def ListAllVariables(): util.List[Attributes] =
{
var input = scala.collection.mutable.Buffer[Attributes]()
input
}
我在ListAllVariables的第一行放置了一个断点,还在QuantSvcHandler处理器中放了几个地方。我在intellij IDEA的debug中运行服务器,在Chrome中打开我的HTML页面,然后按下按钮(调用javascript calc()函数的按钮)。按钮保持卡住状态,我在服务器上看不到任何响应,断点也没有被击中。
关于我做错了什么的任何想法?
答案 0 :(得分:1)
您将HTTP客户端与套接字服务器混合在一起。
虽然HTTP使用套接字,但Thrift HTTP传输与Thrift套接字传输不兼容。 您需要在两端设置完全相同的协议/传输堆栈。该规则的唯一例外是某些服务器传输隐式地需要客户端上的附加帧传输层。
所以解决方案是使用HTTP服务器。根据您使用的版本,您可能还必须切换到JSON协议。