gpt4 book ai didi

java - 使用 Firefox(而不是 Chrome)连接后,Jetty 9.2.x Websocket 服务器连接自动关闭

转载 作者:行者123 更新时间:2023-12-01 12:06:37 27 4
gpt4 key购买 nike

我想使用 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>

服务器输出:新连接已建立...
session 已关闭。原因:+1005,空

为什么它在 chrome 上有效,但在 FF 上无效?他们使用相同的 websocket 版本 13。我还尝试了 Jetty 9.2.5、新的 Mozilla Nightly 和旧的 Firefox 版本。这里没有区别。

最佳答案

改变

context.addServlet(new ServletHolder(new MyServlet()), "/*");

context.addServlet(new ServletHolder(new MyServlet()), "/egal");

这只是次要问题,并不是问题的根本原因。

Firefox 正在正确处理关闭,它只是在您从服务器收到响应之前关闭。

关闭代码 1005 仅表示在未传递关闭代码的情况下发生关闭。如果您将 onbeforeunload() 实现更改为使用 ws.close(1000),您将看到您自己的 javascript 正在关闭连接。注释掉该行,您将看到响应消息。

继续在以下 github 项目中模拟了在嵌入式 jetty 中创建 Websocket 的 5 种不同方法。

https://github.com/jetty-project/embedded-websocket-echo-examples

每个演示都会加载一个 HTML + JavaScript 来演示 connect/hello world/close

它们都适用于 Chrome 和 Firefox

关于java - 使用 Firefox(而不是 Chrome)连接后,Jetty 9.2.x Websocket 服务器连接自动关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27544051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com