javascript - 使用 websocket 在浏览器和 java SE 项目之间传递数据

标签 javascript java eclipse websocket jetty-9

我使用 Java 和 JavaScript 创建了一个示例项目。 Java 用于创建服务器部分,JavaScript 用于创建客户端部分。我用过jetty 9.0.5版本用于开发javaSE项目。 这是我的服务器部分:

package com.websocet;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;


public class WebSocketTest {
    public static void main(String[] args) throws Exception {
        try{
        Server server = new Server(8080);
        WebSocketHandler wsHandler = new WebSocketHandler() {
            @Override
            public void configure(WebSocketServletFactory factory) {
                factory.register(MyWebSocketHandler.class);
            }
        };
        server.setHandler(wsHandler);
        server.start();        
        server.join();
        }catch(Exception e){
            System.out.println("Error "+ e);
        }
    }
}

这是我的 MyWebSocketHandler 类

package com.websocet;

import java.io.IOException;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;

public class MyWebSocketHandler {

    @OnWebSocketClose
    public void onClose(int statusCode, String reason) {
        System.out.println("Close: statusCode=" + statusCode + ", reason=" + reason);
    }

    @OnWebSocketError
    public void onError(Throwable t) {
        System.out.println("Error: " + t.getMessage());
    }

    @OnWebSocketConnect
    public void onConnect(Session session) {
        
        System.out.println("Connect: " + session.getRemoteAddress().getAddress());
        try {
            session.getRemote().sendString("Hello Webbrowser");
        } catch (IOException e) {
            System.out.println("Error -----" + e);
            e.printStackTrace();
        }
    }

    @OnWebSocketMessage
    public void onMessage(String message) {
        System.out.println("Message: " + message);
    }
}

这是我的客户端部分:

console.log("start index.js");

var ws = new WebSocket("ws://localhost:8080/");

ws.onopen = function() {
    console.log("Opened!");
    ws.send("Hello Server");
};

ws.onmessage = function (evt) {
    console.log("Message: " + evt.data);
};

ws.onclose = function() {
    console.log("connection Closed...");
};

ws.onerror = function(err) {
    console.log("Error"+ err);
};

当我运行服务器部分时,它运行良好。

2015-12-11 12:02:31.081:INFO:oejs.Server:main: jetty-9.0.5.v20130815
2015-12-11 12:02:31.141:INFO:oejs.ServerConnector:main: Started ServerConnector@470e2030{HTTP/1.1}{0.0.0.0:8080}

但是在我运行客户端部分后,服务器抛出以下异常。

2015-12-11 12:02:42.055:WARN:oejs.HttpChannel:qtp769287236-18: /
org.eclipse.jetty.websocket.api.InvalidWebSocketException: com.websocet.MyWebSocketHandler does not implement org.eclipse.jetty.websocket.api.WebSocketListener or declare @WebSocket
    at org.eclipse.jetty.websocket.common.events.EventDriverFactory.wrap(EventDriverFactory.java:385)
    at org.eclipse.jetty.websocket.server.WebSocketServerFactory.acceptWebSocket(WebSocketServerFactory.java:177)
    at org.eclipse.jetty.websocket.server.WebSocketHandler.handle(WebSocketHandler.java:90)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:445)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:268)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
    at java.lang.Thread.run(Thread.java:745)

我下载了jetty-distribution-9.0.5.v20130815并将其添加到eclipse IDE中。 我是网络套接字新手。所以请帮我解决这个问题。我的目标是从 Web 浏览器获取数据并将其传递到我的 JavaSE 项目中。如果有人知道这样做,请告诉我。

最佳答案

我找到了问题的答案。我错过了一个注释。必须将其更正为 @WebSocket

@WebSocket
public class MyWebSocketHandler {

  ......

}

关于javascript - 使用 websocket 在浏览器和 java SE 项目之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219988/

相关文章:

javascript - 如何使用时刻时区与 C# TimeZoneInfo 进行映射?

java - 将不同类型的集合迭代到用户定义的类型列表中

java - 如何调用外部库中的方法?

javascript - 比较 json 对象数组中的值

JavaScript localStorage 对象在 Windows 7 的 IE11 中损坏

java - 如何创建一个以泛型类作为类型的泛型类?

java.lang.Object 无法在 Eclipse 中解析

java - Eclipse Helios Mac OS X 10.6.5 有性能问题

javascript - react 路由器dom v5默认路由不起作用

java - Spring Boot : Unable to read resources in lib/*. jar 使用 lib/*.jar 中的类