1

我正在尝试使用 JSNI 为 GWT 的 WebSockets 创建一个简单的绑定,但是每次调用 JSNI 方法时我都会收到异常。简化的类定义如下:

public class Socket extends JavaScriptObject{
    protected Socket() {}

    public static native Socket connect(String url) /*-{
        return new WebSocket(url);
    }-*/;
}

在尝试实例化 Socket 对象时,使用以下行:

Socket socket = Socket.connect("http://www.google.com");

我得到了休闲异常,我不知道为什么:

   java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396)
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:193)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassFormatError: Illegal method name "$" in class edu/catalindumitru/gwt/socket/Socket
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
    at com.google.gwt.dev.shell.CompilingClassLoader.findClass(CompilingClassLoader.java:1078)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at edu.catalindumitru.gwt.steel.client.GameCore.onModuleLoad(GameCore.java:32)
    ... 9 more

我之前曾尝试为类型化数组和网络工作者创建类似的绑定,但我得到了完全相同的错误,所以我决定暂停这些绑定的开发并尝试一些更简单的方法,直到我找到这个异常的原因。

4

4 回答 4

1

当我非常传统地使用 JavaScriptObject 时,我从 GWT 得到了相同的错误报告。

我的问题很简单,所有JSO 方法都必须声明为final,而我错过了一个。

于 2011-10-12T15:16:37.643 回答
1

您缺少 $wnd 前缀

return new $wnd.WebSocket(url);
于 2012-01-19T20:55:10.387 回答
0

只是一个猜测,但据我所知,叠加层用于 JSON 类型的数据。在这里,您尝试对浏览器 API 对象执行封送处理。我不确定它是否会以这种方式工作。特别是 JSNI 对传递的类型有限制。

也许您可以尝试将 WebSocket 存储为本机部分的字段,并将方法委托给该字段。但这只是一个盲目的猜测。

于 2011-06-28T20:34:54.367 回答
0

看看其他人是如何实现它的:http ://code.google.com/p/gwt-comet/source/browse/trunk/src/net/zschech/gwt/websockets/client/WebSocket.java

也许你可以只使用gwt-comet 的 websockets

于 2011-06-29T06:35:40.353 回答