java - 简单的 websocket 和静态文件示例

标签 java jakarta-ee wildfly-8 undertow

尝试设置 undertwo 来玩一下,我正在尝试服务器一个静态 html 文件 index.html 并添加我带注释的 websocket ServerEndpoint pojo,所以我执行了以下操作

final Xnio xnio = Xnio.getInstance("nio", Undertow.class.getClassLoader());
    final XnioWorker xnioWorker = xnio.createWorker(OptionMap.builder().getMap());

    WebSocketDeploymentInfo webSockets  = new WebSocketDeploymentInfo ()
           .addEndpoint(Socket.class)
           .setWorker(xnioWorker);

    final DeploymentManager deployment = defaultContainer()
            .addDeployment(deployment()
                    .setClassLoader(main.class.getClassLoader())
                    .setContextPath("/websockets")
                    .setDeploymentName("websockets")
                    .addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, webSockets));

    deployment.deploy();
    deployment.start();


    Undertow.builder()
            .addHttpListener(8000,"localhost")
            .setHandler(path().addPrefixPath("/", resource(new ClassPathResourceManager(main.class.getClassLoader(), main.class.getPackage())).addWelcomeFiles("WSGSS/index.html")))
            .build()
            .start();

index.html 按预期提供服务,但我似乎无法连接到 websocket,而且我确信我部署 websocket 的方式出了问题,如果我按照 github 上的示例进行操作,它可以工作,但我找不到提供静态文件的正确方法

在 javascript 中我遇到了异常

var ws = new WebSocket("ws://localhost:8000/websockets/socket")

WebSocket connection to 'ws://localhost:8000/websockets/socket' failed: Error during WebSocket handshake: Unexpected response code: 404 

这也是我的 ServerEndpoint

@ServerEndpoint(value = "/socket",
encoders = CommandEncoder.class,
decoders = CommandDecoder.class)
public class Socket{

    private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
    private final Logger log = Logger.getLogger(getClass().getName());

    @OnMessage
    public void onMessage(Session session,Command command){
        log.info("command of type "+ command.getAction() + " recieved");
        command.Process();
        try{
            session.getBasicRemote().sendObject(command);
            //Future<Void> future = session.getAsyncRemote().sendText(message);
        } catch (IOException | EncodeException ex){
            log.info(ex.getMessage() + ex.getCause());
        }
    }

    @OnOpen
    public void  onOpen(Session session){
        sessions.add(session);
        log.info("new session created "+ session.getId());
    }

    @OnClose
    public void onClose(Session session){
        sessions.remove(session);
    }

    @OnError void onError(Session session,Throwable thr){
        log.info(session.getId() + " error " + thr.getMessage() + thr.getCause());
    }
}

最佳答案

下面解决了这个问题

Undertow.builder()
            .addHttpListener(8000,"localhost")
            .setHandler(path()
                    .addPrefixPath("/", resource(new ClassPathResourceManager(main.class.getClassLoader(), main.class.getPackage())).addWelcomeFiles("WSGSS/index.html"))
                    .addPrefixPath("/websocket",manager.deployment()))
            .build()
            .start();

关于java - 简单的 websocket 和静态文件示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645066/

相关文章:

Java EE 5 程序化身份验证

JBoss野飞: Starts but can't connect?

jboss7.x - Wildfly 端口偏移不适用于 Arquiillain

java - 如何在不使用android中的上传按钮的情况下将图像上传到服务器

java - 如何在java中不使用数组进行二分查找

java - 当我们有 Map 时,为什么还需要 Set 呢?

java - JPA 2 和泛型类

基于类型参数的Java EE注入(inject)

java - 如何使用 log4j2 和 slf4j 运行 WildFly-8.x

java - 试图在 java 中将 char 数组作为参数传递并出现索引错误