2016-05-18 27 views
1

Tomcat6で動作していたJavaプロジェクトでwebsocketサーバーを実行しようとしました。私はプロジェクトが現在実行されているTomcat 7サーバーをセットアップしました。 まず、Tomcat7のソケットの例を実行しようとしました。これは完全に実行されます。このクラスを私の古いプロジェクトにコピーしました。古いプロジェクトをやり直すと、以前のようにすべての機能が動作しますが、websocketサーバーだけが動作しません。ウェブソケットTomcat 7は既存のプロジェクトでは動作しません

これは、Tomcatの例を古いプロジェクトにコピーしたChatAnnotationクラスです。

import java.io.IOException; 
import java.util.Set; 
import java.util.concurrent.CopyOnWriteArraySet; 
import java.util.concurrent.atomic.AtomicInteger; 

import javax.websocket.OnClose; 
import javax.websocket.OnError; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 

import org.apache.log4j.Logger; 

@ServerEndpoint(value = "/websocket/chat") 
public class ChatAnnotation { 
    private static Logger logger = Logger.getLogger(ChatAnnotation.class); 

    private static final String GUEST_PREFIX = "Guest"; 
    private static final AtomicInteger connectionIds = new AtomicInteger(0); 
    private static final Set<ChatAnnotation> connections = new CopyOnWriteArraySet<ChatAnnotation>(); 

    private final String nickname; 
    private Session session; 

    public ChatAnnotation() { 
     nickname = GUEST_PREFIX + connectionIds.getAndIncrement(); 
     logger.info("ws instance"); 
    } 

    @OnOpen 
    public void start(Session session) { 
     this.session = session; 
     connections.add(this); 
     String message = String.format("* %s %s", nickname, "has joined."); 
     broadcast(message); 
    } 

    @OnClose 
    public void end() { 
     connections.remove(this); 
     String message = String.format("* %s %s", nickname, "has disconnected."); 
     broadcast(message); 
    } 

    @OnMessage 
    public void incoming(String message) { 
     // Never trust the client 
     String filteredMessage = String.format("%s: %s", nickname, message.toString()); 
     broadcast(filteredMessage); 
    } 

    @OnError 
    public void onError(Throwable t) throws Throwable { 
     logger.error("Chat Error: " + t.toString(), t); 
    } 

    private static void broadcast(String msg) { 
     for (ChatAnnotation client : connections) { 
      try { 
       synchronized (client) { 
        client.session.getBasicRemote().sendText(msg); 
       } 
      } catch (IOException e) { 
       logger.debug("Chat Error: Failed to send message to client", e); 
       connections.remove(client); 
       try { 
        client.session.close(); 
       } catch (IOException e1) { 
        // Ignore 
       } 
       String message = String.format("* %s %s", client.nickname, "has been disconnected."); 
       broadcast(message); 
      } 
     } 
    } 
} 

私はweb.xmlに追加したことがあります。私の古いプロジェクトでは、tcpsocketsを使用してこれを問題にすることができますか? 誰でもこの問題を解決できますか?

EDIT クラスが追加さ:ServerApplicationConfig interface

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

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

import org.apache.log4j.Logger; 

public class ExamplesConfig implements ServerApplicationConfig { 

    private static Logger log = Logger.getLogger(ChatAnnotation.class); 

    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) { 
     Set<ServerEndpointConfig> result = new HashSet<ServerEndpointConfig>(); 
     log.info("getEndpointConfigs"); 
     return result; 
    } 

    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) { 
     log.info("getAnnotatedEndpointClasses");    
     return scanned; 
    } 
} 
+0

[ServerApplicationConfigインターフェイス](https://docs.oracle.com/javaee/7/api/javax/websocket/server/ServerApplicationConfig.html)を実装するクラスはありますか? (Tomcatの例の 'websocket.ExamplesConfig'クラスのように) –

+0

ExampleフォルダにはExampleConfigクラスがありますが、これはどこかで使用されています。 – Michiel

答えて

0

のJavaのWebSocketサーバー使用の戻り値は、プログラムのエンドポイントを展開し、注釈付きのエンドポイントのために。 パッケージ名をChatAnnotationに変更すると、Tomcatの例では、 websocket.ExamplesConfigも変更する必要があります。

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<>(); 
    for (Class<?> clazz : scanned) { 
     String name = clazz.getPackage().getName(); 
     boolean ok = name.startsWith("websocket."); 
     if (ok) { 
      results.add(clazz); 
     } 
    } 
    return scanned; 
} 

getAnnotatedEndpointClasses(scanned)はパッケージ名がのWebSocketで始まるクラスを返します。宣言されていないクラスも、@ServerEndpointの宣言を持っていても展開されません。

+0

お返事ありがとうございます。 examplesConfigクラスを追加しましたが(上記参照)、このクラスを追加することで動作しないため、ソケットサーバを起動する必要があると私はどこかで言います。 – Michiel

+0

実装は 'ChatAnnotation'クラスを返しません。フィルアノテートされたエンドポイントを望んでいない場合、 'getAnnotatedEndpointClasses(>がスキャンされます)'は単に 'scaned'変数を変更せずに返すことができます。 –

+0

私はそれを編集しました。今度は 'scanned'を返していますが、ソケットサーバーに接続しています。私はws://80.0.0.10:8080/clientserverws/chatに接続しようとしています。私のサーバーは80.0.0.10に接続されていて、私のアプリケーションは8080で稼働しています。アプリケーションのWebページにアクセスできます。また私は上記のwebsocketコードからのログを見ません。このサーバーを起動する必要がありますか、それとも自動的に実行されていますか? – Michiel

関連する問題