java - 无法连接到我的 tomcat 8 websocket

标签 java tomcat websocket

我已经编写了一个连接到服务器上的 websocket 的客户端程序。我使用示例设置了 tomcat8,并使用我的客户端程序点击了 EchoAnnotation 端点。

我写了这个端点程序如下:

@ServerEndpoint(value = "/websocket")
public class PortServer implements AirMessageListener {

public PortServer() { }

@OnOpen
public void start(Session session) {
        //do stuff
}

@OnClose
public void end() {
        //do stuff
}
}

@OnMessage
public void incoming(String message) {
        //do stuff
}

@OnError
public void onError(Throwable tw) throws Throwable {
        //do stuff
}

我编译它并创建一个名为 portserver 的 war 文件并将其放入我的 tomcat webapps 目录中。然后我将我的客户端程序从连接到:ws://localhost:8080/examples/websocket/echoAnnotation 切换到 ws://localhost:8080/portserver/websocket 和运行。我得到:

Connecting to:ws://localhost:8080/portserver/websocket
Exception in thread "main" com.corrisoft.air.exception.AirException: Error connecting to server
    at com.corrisoft.air.socket.AirSocketClient.<init>(AirSocketClient.java:60)
    at test.corrisoft.air.portserver.SocketConversation.<init>(SocketConversation.java:46)
    at test.corrisoft.air.portserver.RunPortServerTester.initConfigProperties(RunPortServerTester.java:76)
    at test.corrisoft.air.portserver.RunPortServerTester.<init>(RunPortServerTester.java:34)
    at test.corrisoft.air.portserver.RunPortServerTester.main(RunPortServerTester.java:109)
Caused by: javax.websocket.DeploymentException: Handshake error.
    at org.glassfish.tyrus.client.ClientManager$1$1.run(ClientManager.java:466)
    at org.glassfish.tyrus.client.ClientManager$1.run(ClientManager.java:502)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:654)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:359)
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:195)
    at com.corrisoft.air.socket.AirSocketClient.<init>(AirSocketClient.java:58)
    ... 4 more
Caused by: org.glassfish.tyrus.core.HandshakeException: Response code was not 101: 404.
    at org.glassfish.tyrus.core.Handshake.validateServerResponse(Handshake.java:279)
    at org.glassfish.tyrus.client.TyrusClientEngine.processResponse(TyrusClientEngine.java:138)
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleHandshake(GrizzlyClientFilter.java:318)
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleRead(GrizzlyClientFilter.java:288)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:291)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:209)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:137)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:115)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:550)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
    at java.lang.Thread.run(Thread.java:744)

我在我的 portserver 应用程序中放置了一个 index.html 并且可以点击:http://localhost:8080/portserver 就好了,这意味着目录没问题。然后我验证我的类在我的 WEB-INF/classes 目录中。

我查看了示例并发现了 ExamplesConfig 类,我认为它可能是启用端点的“神奇”类,因此我实现了自己的类并将其卡在 jar 文件中。

/**
 * 
 */
package com.corrisoft.air.portserver;

import java.util.HashSet;
import java.util.Set;

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;

/**
 * @author Corrisoft Android Development
 */
public class WebSocketConfig implements ServerApplicationConfig {

    /* (non-Javadoc)
     * @see javax.websocket.server.ServerApplicationConfig#getAnnotatedEndpointClasses(java.util.Set)
     */
    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
        // Deploy all WebSocket endpoints defined by annotations in the
        // web application. Filter out all others to avoid issues when running
        // tests on Gump
        Set<Class<?>> results = new HashSet<>();
        for (Class<?> clazz : scanned) {
            if (clazz.getPackage().getName().startsWith("com.corrisoft.air")) {
                System.out.println("Adding endpoint for:" + clazz.getName());
                results.add(clazz);
            }
        }
        return results;
    }

    /* (non-Javadoc)
     * @see javax.websocket.server.ServerApplicationConfig#getEndpointConfigs(java.util.Set)
     */
    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs( Set<Class<? extends Endpoint>> scanned) {
        return null;
    }
}

好像没有运行这个类。

我是否遗漏了某些配置?

最佳答案

原来问题是类路径中缺少我的依赖类之一。在这些情况下,Tomcat 8 不会添加端点,也不会在日志中抛出异常。

我将相同的 war 文件部署到 tomcat 7 并出现异常。处理类路径直到一切正常,然后部署回它现在可以工作的 tomcat 8。

我在这里创建了缺陷 56442:https://issues.apache.org/bugzilla/show_bug.cgi?id=56442让 tomcat 吃掉异常而不是显示在日志中。

关于java - 无法连接到我的 tomcat 8 websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201039/

相关文章:

java - 从继承类引用抽象类中声明的变量

java - 在 Scene2d Actor 中绘制形状(即 Image 或 ImageTextButton)

tomcat - 无法通过 ubuntu 从 Tomcat6 中的 Web 应用程序将 MR 作业提交到本地设置

tomcat - 为什么 Jenkins 1.598 和 tomcat 8 自动部署不起作用

spring - 如何在Spring websocket的SessionDisconnectEvent中使用sessionId

java - 在WebSocketHandler中访问HTTP session (Spring-websocket)

java - JMock - Expectations block 中方法的唯一子集

java - 找不到任何支持 AES/GCM/NoPadding 的提供商

tomcat - ModuleDependencyException : Module Magnolia Standard Templating Kit (version 1. 4.4)依赖dms版本1.5/*,没有找到

javascript - Angular - Websocket 和 $rootScope.apply()