Search code examples
gwtwebsocketkaazing

How to receive messages in a GWT App using Kaazing Websockets <type>proxy</type> configuration?


I'm trying to build a GWT (2.4.0) application that can communicate (full-duplex) with a server using a text-based protocol. To accomplish this I'm using Kaazing Websocket Gateway Version 3.3.2 to act as a proxy.

GWT App <-----[websocket]-----> Kaazing <-----[tcp]-----> Backend Server

This is my Kaazing configuration:

<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>

This setup works with the Java implementation of the Kaazing client. Now I want to use this service in a GWT application.

This is my Code for the GWT client implementation:

    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();
    }

The GWT client can successfully send text to the backend server. It just can't process any response from the server. A JavaScript Exception is thrown as soon as ev.getData() is called.

Uncaught JavaScript exception [Uncaught java.lang.ClassCastException: com.google.gwt.core.client.JavaScriptObject$ cannot be cast to java.lang.String]

If I change the WebSocket address in the code above to ws://127.0.0.1:9444/echo to use the Kaazing echo service, any text I send is successfully received by the GWT application. If I change the service back to proxy (or broadcast) the above JavaScript exception is thrown every time a message from the server is received.

The same code in a Java program (using the Kaazing java client) works just fine.

As I am no GWT expert, is there any way I can further debug the problem or is there a simple solution I just fail to see?


Solution

  • I believe I've seen that issue before, do you mind sharing your gwtclient.gwt.xml file content? Or, maybe, try adding '' or '' depending on whether you are using ByteSocket or WebSocket in the 'gwtclient.gwt.xml' of the GWT client.

    Hope this helps,

    -Marcelo