我想使用Jetty构建嵌入式Java WebSocket服务器。我正在使用Jetty 9.2.6。我的客户端是HTML javascript客户端。
使用Google Chrome(39,WebSocket版本13),我可以建立连接并双向发送数据。当我使用Firefox(34,WebSocket版本13)时,建立连接后,连接将立即关闭。在我的SocketListenerClass中,将调用onWebSocketConnect事件,然后立即调用onWebSocketClose事件。我为Socket尝试了3个版本。实现WebSocketListener,扩展WebSocketAdapter并使用注释。到处都一样。
我得到接近原因编号1005(CLOSE_NO_STATUS),但有时为1001。
这是我的代码:服务器:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
public static void main(String[] args)
{
Server server = new Server(80);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(new ServletHolder(new MyServlet()), "/*");
try
{
server.start();
server.join();
}
catch (Exception e)
{
e.printStackTrace();
}
}
Servlet:
import javax.servlet.annotation.WebServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
@SuppressWarnings("serial")
@WebServlet(name = "MyEcho WebSocket Servlet", urlPatterns = { "/egal" })
public class MyServlet extends WebSocketServlet
{
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(MyEchoSocketWithListener.class);
}
}
插座:
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;
public class MyEchoSocketWithListener implements WebSocketListener
{
private Session outbound;
public void onWebSocketClose(int statusCode, String reason)
{
this.outbound = null;
System.out.println("Session has been closed. Reason: +"+statusCode + " , "+reason);
}
public void onWebSocketConnect(Session session)
{
this.outbound = session;
System.out.println("New Connection established...");
}
public void onWebSocketError(Throwable cause)
{
cause.printStackTrace(System.err);
}
public void onWebSocketText(String message)
{
if ((outbound != null) && (outbound.isOpen()))
{
System.out.printf("Echoing back message [%s]%n \n", message);
outbound.getRemote().sendString("Server-Echo: " + message, null);
}
}
JavaScript客户端:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>page title</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<h1>WebSocket Test</h1>
<section id="content"></section>
<script>
var ws;
setTimeout(function (){initWebsocket();}, 3000);
function initWebsocket()
{
ws = new WebSocket("ws://127.0.0.1:80/egal");
window.onbeforeunload = function ()
{
ws.onclose = function ()
{
}; // disable onclose handler first
ws.close()
};
ws.onopen = function ()
{
document.write("WebSocket opened <br>");
ws.send("Hello Server");
document.write("Hello Message sent... <br>");
};
ws.onmessage = function (evt)
{
document.write("Message: " + evt.data + "<br>");
};
ws.onclose = function ()
{
document.write("<br>WebSocket closed<br>");
};
ws.onerror = function (err)
{
document.write("Error: " + err);
};
}
</script>
</body>
</html>
服务器输出:建立了新连接...
会话已关闭。原因:+1005,空
为什么它在chrome上而不在FF上有效?他们使用的Websocket版本是13。我还尝试了Jetty 9.2.5,新的Mozilla Nightly和较旧的Firefox版本。没什么区别。
感谢您的回答。我解决了这个问题,这是由另一个愚蠢的错误引起的。
在我的HTML客户端中,我使用了体内的script标签。我也在websocket事件中使用document.write()。document.write()方法将覆盖整个正文内容。因此,目前我的JavaScript代码已删除。
非常愚蠢的错误...对此表示抱歉。:-)
我在问自己,为什么它仍然可以在Chrome浏览器中使用。:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句