標準の GWT StockWatcherデモ アプリを変更して、websocket 経由で株価を受信しようとしています。Websockets の実装としてgwt-wsを使用しています。gwt-ws ホームページの指示に従って、GWT の組み込みバージョンの Jetty をアップグレードしました。
ただし、websocket 接続を開こうとすると、次の 405 エラーが発生します。誰かアドバイスはありますか?
[WARN] 405 - GET /stockwatcher/webSocket (127.0.0.1) 1457 bytes
Request headers
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:8888
Origin: http://127.0.0.1:8888
Sec-WebSocket-Key: zlH08kgvDw3qHs+/OaQ9/w==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
Response headers
Content-Type: text/html;charset=ISO-8859-1
Cache-Control: must-revalidate,no-cache,no-store
Content-Length: 1457
onModuleLoad() から呼び出されるクライアント側の websocket コードは次のとおりです。
private void setupWebsocket() {
if (!JavaScriptWebSocket.IsSupported())
return;
//webSocketURL looks like "ws://127.0.0.1:8888/de_csenk_gwtws_demo/webSocket"
String webSocketURL = GWT.getModuleBaseURL().replace("http", "ws") + "webSocket";
new JavaScriptWebSocketFactory().createWebSocket(webSocketURL, new WebSocketCallback() {
public void onOpen(WebSocket webSocket) {
log("Web Socket Connection Open");
webSocket.send("Test Message");
}
public void onMessage(WebSocket webSocket, String message) {
log("Web Socket Connection Message: " + message);
}
public void onError(WebSocket webSocket) {
log("Web Socket Connection Error");
}
public void onClose(WebSocket webSocket) {
log("Web Socket Connection Closed");
}
});
}
Web ページに「Web Socket 接続が閉じられました」というログが記録されています。
ここに私のサーブレットがあります:
package com.google.gwt.sample.stockwatcher.StockWatcher.server;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.websocket.WebSocket;
import de.csenk.gwt.ws.server.jetty.JettyWebSocketConnection;
import de.csenk.gwt.ws.shared.Connection;
import de.csenk.gwt.ws.shared.Handler;
public class MyWebSocketServlet extends org.eclipse.jetty.websocket.WebSocketServlet {
public static final long serialVersionUID = 1;
protected WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {
return new JettyWebSocketConnection(new Handler() {
public void onConnectionOpened(Connection connection) throws Throwable {
System.out.println("Connection opened server side");
}
public void onConnectionClosed(Connection connection) throws Throwable {
System.out.println("Connection closed server side");
}
public void onExceptionCaught(Connection connection, Throwable caught) {
System.out.println("exception caught server side");
caught.printStackTrace(System.out);
}
public void onMessageReceived(Connection connection, Object message) throws Throwable {
System.out.println("Message Received! " + message);
}
});
}
}
ここに StockWatcher.gwt.xml があります
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='stockwatcher'>
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User'/>
<!-- Inherit the default GWT style sheet. You can change -->
<!-- the theme of your GWT application by uncommenting -->
<!-- any one of the following lines. -->
<!-- <inherits name='com.google.gwt.user.theme.clean.Clean'/> -->
<inherits name='com.google.gwt.user.theme.standard.Standard'/>
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
<!-- Other module inherits -->
<inherits name='de.csenk.gwt.ws.WebSocket'/>
<!-- Specify the app entry point class. -->
<entry-point class='com.google.gwt.sample.stockwatcher.StockWatcher.client.StockWatcher'/>
<!-- Specify the paths for translatable code -->
<source path='client'/>
<source path='shared'/>
</module>
ここにweb.xmlがあります
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee">
<!-- Servlets -->
<servlet>
<servlet-name>webSocket</servlet-name>
<servlet-class>com.google.gwt.sample.stockwatcher.StockWatcher.server.MyWebSocketServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webSocket</servlet-name>
<url-pattern>/stockwatcher/webSocket</url-pattern>
</servlet-mapping>
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>StockWatcher.html</welcome-file>
</welcome-file-list>
</web-app>