Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GWT,(简单)WebSocket和405警告_Javascript_Gwt_Websocket - Fatal编程技术网

Javascript GWT,(简单)WebSocket和405警告

Javascript GWT,(简单)WebSocket和405警告,javascript,gwt,websocket,Javascript,Gwt,Websocket,我在使用GWT(2.6.0)运行基本WebSocket功能时遇到问题 我正在使用默认生成的GWT应用程序和GWT的内置服务器,并尝试扩展代码以允许WebSocket通信。当尝试打开/升级连接时,我看到405警告 资料来源如下。当我尝试连接(单击“连接”按钮)时,Eclipse控制台中会出现警告。此时,发送消息并尝试关闭连接不起任何作用 1:控制台消息: [WARN] 405 - GET /jtreeservertest/echo (127.0.0.1) 1455 bytes Request

我在使用GWT(2.6.0)运行基本WebSocket功能时遇到问题

我正在使用默认生成的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:echonedpoint.java:

)

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>

greetServlet
jTreeServerTest.server.GreetingServiceImpl
greetServlet
/jtreeserver测试/问候
聊天服务器
jTreeServerTest.server.echonendpoint
聊天服务器
/jtreeservertest/echo
JTreeServerTest.html
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>
...

var-ws=null;
函数连接(){
ws=newwebsocket(“ws://127.0.0.1:8888/jtreeservertest/echo”);
ws.onopen=函数(){
document.getElementById(“chatlog”).textContent=“connected\n”;
};
ws.onmessage=函数(消息){
document.getElementById(“chatlog”).textContent+=message.data+“\n”;
};
ws.onclose=function(){
console.log(“连接关闭”);
}
ws.onerror=函数(错误){
console.log('检测到错误:'+错误);
}
}
函数postToServer(){
send(document.getElementById(“msg”).value);
document.getElementById(“msg”).value=“”;
}
函数closeConnect(){
ws.close();
}
...

发送! 终点 连接

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

但是,即使您将webapp部署到支持它的servlet容器中,它仍然会失败,并出现相同的405方法不允许的错误

这是因为
扩展了RemoteServiceServlet
(没有明显的原因),它只接受
POST
请求,而您的浏览器通过
升级:websocket
执行
GET
请求

您应该要么扩展
javax.websocket.server.Endpoint
,要么什么也不扩展,只使用
@ServerEndpoint
注释

但即使这样也不够:您的webapp将不再启动,因为端点不是servlet,您在web.xml的
中声明了它。您应该依赖类路径扫描,或者从
ServletContextListener
部署websocket端点;看

    <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>