java - 在 Nashorn 中使用 WebSocket

标签 java websocket java-8 nashorn

我正在使用 Intellij IDE,我想在由 Nashorn Java8 评估的 javascript 中实现 websocket。我的 javascript 文件顶部有以下行:

var socket = new WebSocket("http://localhost:12345/echo");

但它给了我这个错误:

Caused by: javax.script.ScriptException: ReferenceError: "WebSocket" is not defined in src/sample/hello.js at line number 8
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:564)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:548)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:528)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:524)
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:194)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at sample.Main.start(Main.java:28)
    at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
    at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
    ... 1 more
Caused by: src/sample/hello.js:8 ReferenceError: "WebSocket" is not defined
    at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:56)
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:318)
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:290)
    at jdk.nashorn.api.scripting.NashornScriptEngine.__noSuchProperty__(NashornScriptEngine.java:274)
    at jdk.nashorn.internal.scripts.Script$engine._L35(nashorn:engine/resources/engine.js:37)
    at jdk.nashorn.internal.scripts.Script$hello.runScript(src/sample/hello.js:8)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:498)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:206)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378)
    at jdk.nashorn.internal.runtime.Context.evaluateSource(Context.java:885)
    at jdk.nashorn.internal.runtime.Context.load(Context.java:563)
    at jdk.nashorn.internal.objects.Global.load(Global.java:857)
    at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:1)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:498)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:206)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:546)
    ... 16 more

WebSocket 是在 HTML5 插件中定义的,所以我不太确定为什么 Nashorn 在库中找不到 websocket。

最佳答案

Nashorn 是一个兼容 ECMAScript5 的 JavaScript 引擎。 WebSocket API 不是 ECMAScript 5 的一部分,而是浏览器 API。 您可以使用任何可用的 Java WebSocket 客户端库来实现 WebSocket API。

例如,http://jfarcand.wordpress.com/2011/12/21/writing-websocket-clients-using-asynchttpclient/https://tyrus.java.net/documentation/1.7/user-guide.html#websocket-client-endpoint

对于 vertx 框架,它具有连接到 WebSocket 端点的 API https://github.com/vert-x/vertx-examples/blob/master/src/raw/javascript/websockets/ws_client.js

关于java - 在 Nashorn 中使用 WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823958/

相关文章:

java - 升级到 Java 8 导致单元测试中的 Orika 映射器 java.io.IOException : invalid constant type: 15 at 142

java - 如何从私有(private)方法调用数组?

java - 如何阻止 Kotlin 从一个带有可选参数的 Kotlin 函数中创建多个重载的 Java 方法

sockets - 如何使用NodeJS将监听一个端口的WebSocket连接到监听另一个端口的Net socket?

java - LibGDX - HTML5 runner,带网络?

javascript - WebSocket 握手 : Unexpected response code: 404

Java 8 Stream 函数将变位词列表分组到列表映射中

java - 无法在 Java8 中将悉尼转换为布里斯类 LocalDateTime

java - 使用 OAuth2/OIDC 保护微配置文件 REST 客户端

java - 根据当天返回 SQLite 数据 - 无结果