我正在尝试构建一个GWT(2.4.0)应用程序,它可以使用基于文本的协议与服务器进行通信(全双工)。为了实现这一点,我使用Kaazing Websocket Gateway Version 3.3.2作为代理。
GWT App < ----- [websocket] -----> Kaazing < ----- [tcp] -----> 后端服务器
这是我的Kaazing配置:
<service>
<accept>ws://127.0.0.1:9444/foobar</accept>
<connect>tcp://localhost:50189</connect>
<type>proxy</type>
<cross-site-constraint>
<allow-origin>http://127.0.0.1:8888</allow-origin>
</cross-site-constraint>
</service>
此设置适用于Kaazing客户端的Java实现。现在我想在GWT应用程序中使用此服务。
这是我的GWT客户端实现代码:
WebSocket ws;
try {
ws = new WebSocket("ws://127.0.0.1:9444/foobar");
ws.addCloseHandler(new CloseHandler() {
@Override
public void onClose(CloseEvent ev) {
}
});
ws.addMessageHandler(new MessageHandler() {
@Override
public void onMessage(MessageEvent ev) {
System.out.println(ev.getData());
}
});
ws.addOpenHandler(new OpenHandler() {
@Override
public void onOpen(OpenEvent ev) {
}
});
} catch (WebSocketException e) {
e.printStackTrace();
}
GWT客户端可以成功地将文本发送到后端服务器。它只是无法处理来自服务器的任何响应。一旦调用 ev.getData(),就会抛出JavaScript异常。
Uncaught JavaScript exception [Uncaught java.lang.ClassCastException: com.google.gwt.core.client.JavaScriptObject$ cannot be cast to java.lang.String]
如果我将上面代码中的WebSocket地址更改为 ws://127.0.0.1:9444 / echo 以使用Kaazing echo服务,我发送的任何文本都会被GWT应用程序成功接收。如果我将服务更改回代理(或广播),则每次收到来自服务器的消息时都会抛出上述JavaScript异常。
Java程序中的相同代码(使用Kaazing java客户端)工作正常。
由于我不是GWT专家,我有什么方法可以进一步调试问题,还是有一个简单的解决方案,我只是看不到?
答案 0 :(得分:0)
我相信我以前见过这个问题,你介意分享你的gwtclient.gwt.xml文件内容吗?或者,也许,尝试添加''或''取决于您是否在GWT客户端的'gwtclient.gwt.xml'中使用ByteSocket或WebSocket。
希望这有帮助,
-Marcelo