2014-03-24 59 views
0
我遇到了麻煩與GWT(2.6.0)上運行的基本的WebSocket功能

GWT,(簡單)的WebSockets和405個警告

我使用的是默認生成的GWT應用和GWT內置的服務器,只是想延長代碼,允許的WebSocket通信。當試圖打開/「升級」連接時,我看到一個405警告。

源如下。當我嘗試連接(點擊「連接」按鈕),警告出現在Eclipse控制檯。發送消息並試圖關閉連接在這一點上什麼也不做。

1:控制檯消息:

[WARN] 405 - GET /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, like 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 to 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> 

回答

1

首先,DevMode的嵌入式服務器不支持javax.websocket

但即使您將webapp部署到支持它的servlet容器,它仍然會以相同的方式失敗405方法不允許錯誤。

這是因爲你extends RemoteServiceServlet(沒有明顯的理由),只接受POST請求,而瀏覽器做了GET請求與Upgrade: websocket

你應該可以擴展javax.websocket.server.Endpoint或只是延長什麼並有@ServerEndpoint註解。

但即便如此,這還不夠:由於端點不是servlet,因此webapp將不再啓動,並且您在web.xml中的<servlet>中聲明它。您應該依靠類路徑掃描,或從ServletContextListener部署websocket端點;看到https://tyrus.java.net/documentation/latest/index/deployment.html