无法连接到我的tomcat 8 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/echoAnnotationws://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.(AirSocketClient.java:60) at test.corrisoft.air.portserver.SocketConversation.(SocketConversation.java:46) at test.corrisoft.air.portserver.RunPortServerTester.initConfigProperties(RunPortServerTester.java:76) at test.corrisoft.air.portserver.RunPortServerTester.(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.(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就好了,这意味着目录没问题。 然后我validation我的class级在我的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 getEndpointConfigs( Set<Class> scanned) { return null; } } 

它似乎没有运行这个类。

我错过了一些配置吗?

事实certificate,问题是我的一个依赖类在类路径中丢失了。 在这些情况下,Tomcat 8不会添加端点,也不会在日志中引发exception。

我将相同的war文件部署到tomcat 7并获得exception。 处理类路径直到它好,然后部署回到tomcat 8,它现在正在工作。

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

对于其他受此困扰的人; 仔细看看你的URI。 我根据配置文件将我的url拼凑在一起。 构建URL时我错过了一个“/”字符,并确信它是正确的! 如果您执行以下操作,我建议打印出“构建的URL”并在追逐尾部之前仔细研究:

 public static final String WEBSOCKETHOST = "localhost"; // TODO: Get from configuration public static final int WEBSOCKETPORT = 10080; // TODO: Get from configuration public static final String WEBSOCKETSERVERROOT = "/sceagents"; // TODO: Get from configuration public static final String WEBSOCKETSERVERENDPOINT = "neo"; // TODO: Get from configuration public static final String WEBSOCKETPROTOCOL = "ws"; // TODO: Get from configuration String uri = WEBSOCKETPROTOCOL + "://" + WEBSOCKETHOST + ":" + Integer.toString(WEBSOCKETPORT) + WEBSOCKETSERVERROOT + "/" + WEBSOCKETSERVERENDPOINT;