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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -