私は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 環境にデプロイします。