2015-01-07 3 views
1

Я использую Intellij IDE, и я хочу реализовать websocket в javascript, который оценивается Nashorn Java8. У меня есть следующая строка в верхней части моего файла JavaScript:использование WebSocket в Nashorn

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 в библиотеке.

+0

Что именно этот «плагин HTML 5»? – zeroflagL

+0

@zeroflagL это встроенный плагин в intellij IDE, определенный в файле javascript HTML5.js – Syenun

ответ

3

Nashorn - это механизм JavaScript, совместимый с ECMAScript5. API WebSocket не является частью ECMAScript 5, но браузера API. Вы можете реализовать API WebSocket, используя любые доступные клиентские библиотеки Java WebSocket.

Например, 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, имеет API для подключения к WebSocket конечной https://github.com/vert-x/vertx-examples/blob/master/src/raw/javascript/websockets/ws_client.js

+0

большое спасибо за ваш ответ, теперь это имеет для меня больше смысла. Но единственная проблема в том, что я использую vertx.IO и совместим только с sockJS и WebSocket. Нет другого способа загрузить внешнюю библиотеку? – Syenun

+0

@Syenun vertx имеет http-клиент, который может подключаться к точкам веб-сокета. вот пример того, как вы можете подключиться к конечной точке WebSocket с помощью vertx https://github.com/vert-x/vertx-examples/blob/master/src/raw/javascript/websockets/ws_client.js –

+0

спасибо! очень полезно – Syenun

0

Для включения поддержки API WebSocket в Nashorn Java-9-х HttpClient модуль jdk.incubator.httpclient может быть другой вариант , Это API несколько проще по сравнению с другими клиентскими библиотеками Java WebSocket. Я собрал базовый пример того, как использовать его, чтобы включить API-интерфейс WebSocket в г. Нашорн: https://github.com/kjussakov/sochorn

Смежные вопросы