1

私はwebsocketsで遊んでみたいので、そのようなWSサーバーを作成しました:

@ServerEndpoint(value = "/chat")
public class WsChatServlet{
private static final Logger LOGGER =
        Logger.getLogger(WsChatServlet.class.getName());

@OnOpen
public void onOpen(Session session) {
    LOGGER.log(Level.INFO, "New connection with client: {0}",
            session.getId());
}

@OnMessage
public String onMessage(String message, Session session) {
    LOGGER.log(Level.INFO, "New message from Client [{0}]: {1}",
            new Object[] {session.getId(), message});
    return "Server received [" + message + "]";
}

@OnClose
public void onClose(Session session) {
    LOGGER.log(Level.INFO, "Close connection for client: {0}",
            session.getId());
}

@OnError
public void onError(Throwable exception, Session session) {
    LOGGER.log(Level.INFO, "Error for client: {0}", session.getId());
}
}

Java 7 で実行されている Tomcat 7 にデプロイしました。次に、そのクライアントを作成しました。

@ClientEndpoint
public class Main {
private static final String uri = "ws://myserver.net/chat";

public static void main(String[] args) throws DeploymentException, IOException, URISyntaxException, InterruptedException {
    WebSocketContainer wsContainer =  ContainerProvider.getWebSocketContainer();
    Session session = wsContainer.connectToServer(Main.class, new URI(uri));
    session.getBasicRemote().sendText("Here is a message!");
    Thread.sleep(1000);
    session.close();
}

@OnMessage public void processMessage(String message){
    System.out.println(message);
}
}

このクライアントは、コマンドライン アプリとして実行されます。実行すると、例外が発生します:

Exception in thread "main" javax.websocket.DeploymentException: The HTTP response from the server [HTTP/1.1 302 Found] did not permit the HTTP upgrade to WebSocket

そのため、サーバーがクライアントに適切に応答していないようです。にアクセスするws://myserver.net/chatと 302 で応答するのに、ws://myserver.net/chat/(通知/) の場合は 200 OK で応答することに気付きました。

さらに興味深いのは、この Tomcat のログです。

    • [01/Oct/2014:15:52:35 +0000] "GET /chat/ HTTP/1.0" 200 57
    • [01/Oct/2014:15:52:42 +0000] "GET /chat HTTP/1.0" 302 -

ご覧のとおり、私のクライアントは HTTP 1.1 ではなく HTTP 1.0 で接続していますが、これは間違っている可能性があります。私はそれに完全に立ち往生しています。なぜそれが機能しないのか理解できません。

編集: だから、私の主な質問は、なぜ websockets が機能しないのか (HTTP Upgrade 応答ヘッダーが欠落していると思います)、それを修正する方法です。

EDIT2: 最も重要なことを忘れていました: 無料の Jelastic 環境にデプロイします。

4

2 に答える 2