2015-01-21 6 views
2

Я пробовал сервер Tomcat с websocket. Это то, что я делаю: Я создал 3 java-файла, скопированных из примеров Tomcat. См. Код ниже. Затем я создаю файл войны и помещаю его в webapps. Но потом я получил это сообщение об ошибке: Info: соединение с WebSocket закрыто, Код: 1006Соединение Tomcat WebSocket закрыто, Код: 1006 issue

Пропустить какой-либо шаг, чтобы сделать websocket на Tomcat?

Спасибо.

1. ExamplesConfig.java 

    import java.util.HashSet; 
    import java.util.Set; 
    import javax.websocket.Endpoint; 
    import javax.websocket.server.ServerApplicationConfig; 
    import javax.websocket.server.ServerEndpointConfig; 
    public class ExamplesConfig implements ServerApplicationConfig 
    { 
     @Override 
     public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scanned) 
     { 
      Set<ServerEndpointConfig> result = new HashSet<ServerEndpointConfig>(); 
      System.out.println("ExamplesConfig ==========> getEndpointConfigs"); 
      if (scanned.contains(EchoEndpoint.class)) 
      { 
       result.add(ServerEndpointConfig.Builder.create(EchoEndpoint.class, "/websocket/echoProgrammatic").build()); 
      } 
      return result; 
     } 

     @Override 
     public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) 
     { 
      // Deploy all WebSocket endpoints defined by annotations in the examples 
      // web application. Filter out all others to avoid issues when running 
      // tests on Gump 
      Set<Class<?>> results = new HashSet<Class<?>>(); 
      for (Class<?> clazz : scanned) 
      { 
       if (clazz.getPackage().getName().startsWith("websocket.")) 
       { 
        System.out.println("getAnnotatedEndpointClasses ===========>" + clazz); 
        results.add(clazz); 
       } 
      } 
      return results; 
     } 
    } 

2. EchoEndpoint.java 

    import java.io.IOException; 
    import java.nio.ByteBuffer; 

    import javax.websocket.Endpoint; 
    import javax.websocket.EndpointConfig; 
    import javax.websocket.MessageHandler; 
    import javax.websocket.RemoteEndpoint; 
    import javax.websocket.Session; 

    public class EchoEndpoint extends Endpoint 
    { 
     @Override 
     public void onOpen(Session session, EndpointConfig endpointConfig) { 
      RemoteEndpoint.Basic remoteEndpointBasic = session.getBasicRemote(); 
      session.addMessageHandler(new EchoMessageHandlerText(remoteEndpointBasic)); 
      session.addMessageHandler(new EchoMessageHandlerBinary(remoteEndpointBasic)); 
     } 

     private static class EchoMessageHandlerText 
       implements MessageHandler.Partial<String> { 

      private final RemoteEndpoint.Basic remoteEndpointBasic; 

      private EchoMessageHandlerText(RemoteEndpoint.Basic remoteEndpointBasic) { 
       this.remoteEndpointBasic = remoteEndpointBasic; 
      } 

      @Override 
      public void onMessage(String message, boolean last) { 
       try { 
        if (remoteEndpointBasic != null) { 
         remoteEndpointBasic.sendText(message, last); 
        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     private static class EchoMessageHandlerBinary 
       implements MessageHandler.Partial<ByteBuffer> { 

      private final RemoteEndpoint.Basic remoteEndpointBasic; 

      private EchoMessageHandlerBinary(RemoteEndpoint.Basic remoteEndpointBasic) { 
       this.remoteEndpointBasic = remoteEndpointBasic; 
      } 

      @Override 
      public void onMessage(ByteBuffer message, boolean last) { 
       try { 
        if (remoteEndpointBasic != null) { 
         remoteEndpointBasic.sendBinary(message, last); 
        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

3. EchoAnnotation.java 

    import java.io.IOException; 
    import java.nio.ByteBuffer; 

    import javax.websocket.OnMessage; 
    import javax.websocket.PongMessage; 
    import javax.websocket.Session; 
    import javax.websocket.server.ServerEndpoint; 

    @ServerEndpoint("/websocket/echoAnnotation") 
    public class EchoAnnotation 
    { 
     @OnMessage 
     public void echoTextMessage(Session session, String msg, boolean last) { 
      try { 
       if (session.isOpen()) { 
        System.out.println("==========> this is my code"); 
        session.getBasicRemote().sendText(msg, last); 
       } 
      } catch (IOException e) { 
       try { 
        session.close(); 
       } catch (IOException e1) { 
        // Ignore 
       } 
      } 
     } 

     @OnMessage 
     public void echoBinaryMessage(Session session, ByteBuffer bb, 
       boolean last) { 
      try { 
       if (session.isOpen()) { 
        session.getBasicRemote().sendBinary(bb, last); 
       } 
      } catch (IOException e) { 
       try { 
        session.close(); 
       } catch (IOException e1) { 
        // Ignore 
       } 
      } 
     } 

     /** 
     * Process a received pong. This is a NO-OP. 
     * 
     * @param pm Ignored. 
     */ 
     @OnMessage 
     public void echoPongMessage(PongMessage pm) { 
      // NO-OP 
     } 
    } 
+0

Не могли бы вы сказать нам, какие JVM вы используете? Можете ли вы отобразить файл web.xml? –

ответ

0

Этот пример работы в порядке с Tomcat 7 .0.x если вы работаете JVM версии 1.7 и ваше использование web.xml Servlet Specification версии 3.0 согласно Tomcat documentation.

Вы web.xml файл должен выглядеть следующим образом:

<web-app version="3.0" ... >