2014-04-21 3 views
0

서버의 websocket에 연결하는 클라이언트 프로그램을 작성했습니다. 예제를 가지고 tomcat8을 설정하고 클라이언트 프로그램으로 EchoAnnotation 엔드 포인트를 쳤다.내 tomcat 8 websocket에 연결할 수 없습니다.

@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을 만들어 내 바람둥이의 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; 
    } 
} 

이 클래스를 실행하지 않는 것 같습니다.

내가 놓친 구성이 있습니까?

답변

1

내 종속 클래스 중 하나가 클래스 경로에서 누락되었습니다. 이러한 상황에서 Tomcat 8은 끝점을 추가하지 않으며 로그에 예외를 throw하지 않습니다.

tomcat 7에 동일한 war 파일을 배포했는데 예외가 발생했습니다. 클래스 패스가 잘 돌아갈 때까지 작업 한 다음 지금 작동중인 tomcat 8에 다시 배포합니다.

여기에 결함 56442가 작성되었습니다. 로그에 표시하는 대신 예외를 먹는 톰캣의 경우 https://issues.apache.org/bugzilla/show_bug.cgi?id=56442입니다.

+0

URL을 자세히 살펴보십시오. 구성 파일을 기반으로 함께 URL을 연결했습니다. URL을 구성 할 때 한 개의 "/"문자를 놓친 것이고 그것이 맞았다 고 확신했습니다! 다음과 같은 일을하는 경우 "건설 된 URL"을 인쇄하고 이야기를 쫓기 전에 자세히 공부하십시오. – Darrin

+0

@Darrin이 정보가 도움이된다면 질문 및/또는 답변을 upvote하십시오. – Thom

0

다른 사람에게 이로 인해 괴롭힘. 귀하의 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; 
관련 문제