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