当前位置: 首页 > 知识库问答 >
问题:

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

端木野
2023-03-14

我想使用Jetty构建一个嵌入式Java WebSocket服务器。我正在使用Jetty 9.2.6。我的客户端是一个HTML javascript客户端。

使用Google Chrome(39,WebSocket13版),我可以建立连接并双向发送数据。当我使用Firefox(34,WebSocket版本13)时,连接建立后直接关闭。在我的SocketListenerClass中,调用onWebSocketConnect事件,立即调用onWebSocketClose事件。我为我的插座试了三个版本。实现WebSocketListener,扩展WebSocketAdapter并使用注释。到处都一样。

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();
      }
    }
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上不起作用?他们使用的是相同的WebSocket13版。我还尝试了Jetty 9.2.5和一个新的Mozilla Nightly和一个较旧的Firefox版本。这里没什么区别。

共有1个答案

雍焱
2023-03-14

改变

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

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

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

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

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

它们都与Chrome和Firefox一起工作

 类似资料:
  • 我正在使用C#开发简单的minecraft启动器。我想自动连接用户到我们的服务器使用IP地址和端口时,用户开始我的世界。

  • 另一个宽大处理--B: 这里要注意,实体A和B之间没有隐式关系,B表中的a_id是手工处理的,因此--关系类似于一对多(A-->B),但不是jpa-hibernate关系。而且,我的FullDto有A的所有属性和B的列表: 现在,我想从A的存储库接口中提取所有内容(A和B表一次完成),如下所示:

  • 我在运行使用Netty的服务时遇到了问题。它启动和工作正常,但只有一次。在此之后,不接受任何连接(它们将立即被删除)。 当我第一次使用(示例端口,随便什么)连接到服务器时,一切正常: 客户端会话: 服务器日志: --编辑2-- 只要连接处于活动状态,服务器就可以正常工作--在关闭连接之前,我可以轻松地交换请求/响应。 不要被IP地址迷惑,这是一个转发到Docker的本地端口,应用程序就是在那里启动

  • 本文向大家介绍使用phpMyAdmin连接到外部服务器,包括了使用phpMyAdmin连接到外部服务器的使用技巧和注意事项,需要的朋友参考一下 下面的代码行可以添加到底部的/etc/phpmyadmin/config.inc.php文件中- 它将显示“当前服务器:”,并同时下拉“ 127.0.0.1”和$cfg ['Servers'] [$i] ['host']提供的下拉列表。 用户可以在两个服务

  • 这是mysql连接php脚本。它不断地显示出它的错误 警告:mysqli_connect():(HY000/1045):用户'user'@'localhost'(使用密码:YES)在第6行的C:\xampp\htdocs\index.php访问被拒绝 注意:尝试在第7行连接成功的C:\xampp\htdocs\index.php中获取非对象的属性 我听不懂,请帮帮我好吗?

  • 首先,我知道有很多类似的问题,但我所看到的似乎都不能解决我的设置(我发现的任何解决方案都不管用)。所以请容忍我。。。 我的服务器主机名是IP地址,而不是域名(即URL看起来像:) 我的服务器有一个真正的证书(即,没有自签名) 我的应用程序的plist条目字典为空(没有任何例外-出厂设置ATS) 这是生产代码,我不能禁用ATS(我也不认为我可以,因为例外只适用于显式域名,而不是IP地址) (iOS9