javascript - GWT, (simple) Websockets and 405 warnings -
i'm having trouble getting basic websocket functionality running gwt (2.6.0).
i'm using default generated gwt app , gwt's built-in server, , trying extend code allow websocket communication. when trying open / "upgrade" connection, see 405 warning.
source below. when try connect (click on "connect" button), warning appears in eclipse console. sending message , trying close connection nothing @ point.
1: console message:
[warn] 405 - /jtreeservertest/echo (127.0.0.1) 1455 bytes request headers upgrade: websocket connection: upgrade host: 127.0.0.1:8888 origin: http://127.0.0.1:8888 pragma: no-cache cache-control: no-cache sec-websocket-key: gdlkr0qckcrd6fvjafkncg== sec-websocket-version: 13 sec-websocket-extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame user-agent: mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, gecko) chrome/33.0.1750.154 safari/537.36 response headers content-type: text/html;charset=iso-8859-1 cache-control: must-revalidate,no-cache,no-store content-length: 1455
2: echoendpoint.java:
;
import java.io.ioexception; import javax.websocket.onerror; import javax.websocket.onmessage; import javax.websocket.onopen; import javax.websocket.session; import javax.websocket.server.serverendpoint; import com.google.gwt.user.server.rpc.remoteserviceservlet; @serverendpoint("/echo") public class echoendpoint extends remoteserviceservlet { @onopen public void openconnection(session session) { system.out.println("connection opened: " + session); } @onerror public void onerror() { system.out.println("error"); } @onmessage public void onmessage(session session, string msg) { try { session.getbasicremote().sendtext(msg); } catch (ioexception e) { system.out.println(e); } } }
3: 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>greetservlet</servlet-name> <servlet-class>jtreeservertest.server.greetingserviceimpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>greetservlet</servlet-name> <url-pattern>/jtreeservertest/greet</url-pattern> </servlet-mapping> <servlet> <servlet-name>chatservlet</servlet-name> <servlet-class>jtreeservertest.server.echoendpoint</servlet-class> </servlet> <servlet-mapping> <servlet-name>chatservlet</servlet-name> <url-pattern>/jtreeservertest/echo</url-pattern> </servlet-mapping> <!-- default page serve --> <welcome-file-list> <welcome-file>jtreeservertest.html</welcome-file> </welcome-file-list> </web-app>
4: index.html:
<script type="text/javascript" language="javascript" src="jtreeservertest/jtreeservertest.nocache.js"></script> <script> var ws = null; function connect() { ws = new websocket("ws://127.0.0.1:8888/jtreeservertest/echo"); ws.onopen = function(){ document.getelementbyid("chatlog").textcontent = "connected\n"; }; ws.onmessage = function(message){ document.getelementbyid("chatlog").textcontent += message.data + "\n"; }; ws.onclose = function(){ console.log('connection closed'); } ws.onerror = function(error){ console.log('error detected: ' + error); } } function posttoserver(){ ws.send(document.getelementbyid("msg").value); document.getelementbyid("msg").value = ""; } function closeconnect(){ ws.close(); } </script> ...
<textarea id="chatlog" readonly></textarea><br/> <input id="msg" type="text" /> <button type="submit" id="sendbutton" onclick="posttoserver()">send!</button> <button type="submit" id="sendbutton" onclick="closeconnect()">end</button> <button type="submit" id="connectbutton" onclick="connect()">connect</button>
first, devmode's embedded server doesn't support javax.websocket
.
but if deployed webapp servlet container supports it, still fail same 405 method not allowed error.
this because extends remoteserviceservlet
(with no apparent reason), accepts post
requests, whereas browser get
request upgrade: websocket
.
you should either extend javax.websocket.server.endpoint
or extend nothing , have @serverendpoint
annotation.
but wouldn't enough: webapp no longer start endpoint not servlet, , declared in <servlet>
in web.xml. should either rely on classpath scanning, or deploy websocket endpoint servletcontextlistener
; see https://tyrus.java.net/documentation/latest/index/deployment.html
Comments
Post a Comment