我正在尝试构建一个 GWT (2.4.0) 应用程序,该应用程序可以使用基于文本的协议与服务器进行通信(全双工)。为此,我使用 Kaazing Websocket Gateway 版本 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 专家,有什么方法可以进一步调试问题,还是有一个我看不到的简单解决方案?