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

java 使用 websocket 的包, 连接 wss 的 websocket 失败?

卢知
2024-03-07

使用 jar 包 , 连接 websocket, 用域名的方式连接失败, 中间有通过 nginx 转发

<dependency>    <groupId>org.java-websocket</groupId>    <artifactId>Java-WebSocket</artifactId>    <version>1.5.3</version></dependency>

用浏览器的控制台 new Websocket(wss://域名) 已经成功

nginx 配置正常的 , 用于 websocket 的配置添加了

proxy_set_header    Upgrade             $http_upgrade;proxy_set_header    Connection          "upgrade";proxy_http_version 1.1;

使用 ws://域名 方式报 400 错误

用 wss://域名 方式 nginx 连请求都没收到

域名是买的, 是能通过验证的

使用 http 直接连接服务的方式是成功的

java 代码

ClientWs clientWs = new ClientWs(url);clientWs.connect();while (!clientWs.getReadyState().equals(ReadyState.OPEN)) {    try {        Thread.sleep(1000);    } catch (InterruptedException e) {    }    System.out.println("Connecting...");    if (clientWs.getReadyState() == ReadyState.CLOSED){        System.out.println("连接失败");        System.exit(-1);    }}System.out.println("Connected.");
public class ClientWs extends WebSocketClient {    public ClientWs(URI serverUri) {        super(serverUri);        trustAllHosts(this);    }    public ClientWs(URI serverUri, Map<String, String> httpHeaders) {        super(serverUri, httpHeaders);        trustAllHosts(this);    }    @Override    public void onOpen(ServerHandshake serverHandshake) {    }    @Override    public void onMessage(String s) {    }    @Override    public void onClose(int i, String s, boolean b) {    }    @Override    public void onError(Exception e) {    }    static void trustAllHosts(ClientWs clientWs){        TrustManager[] trustAllCerts =new TrustManager[]{new X509TrustManager(){            @Override            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {            }            @Override            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {            }            @Override            public X509Certificate[] getAcceptedIssuers() {                return new java.security.cert.X509Certificate[]{};            }        }};        try {            SSLContext ssl = SSLContext.getInstance("TLS");            ssl.init(null, trustAllCerts,new java.security.SecureRandom());        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (KeyManagementException e) {            e.printStackTrace();        }    }}

共有2个答案

董光霁
2024-03-07

你应该使用js来进行连接Websocket,或者使用工具,比如 http://www.jsons.cn/websocket/
或者新版的postman是能支持Websocket,浏览器直接访问ws是不行的

蒋航
2024-03-07

从你提供的信息来看,你正在使用 Java-WebSocket 库来尝试连接到一个通过 Nginx 代理的 WebSocket 服务器,但是遇到了问题。以下是一些可能的原因和解决方案:

  1. SSL/TLS 握手问题:你的 Java 代码试图通过不安全的 ws:// 协议连接到服务器,这可能导致 400 错误。你应该使用 wss:// 协议来确保连接的安全性。同时,你的 trustAllHosts 方法可能会导致 SSL/TLS 握手失败,因为它接受所有的服务器证书,包括那些可能不安全的证书。你应该检查服务器的证书是否有效,并在可能的情况下使用正确的证书。
  2. Nginx 配置问题:虽然你已经在 Nginx 配置中添加了处理 WebSocket 的相关设置,但是可能存在其他问题。你应该检查 Nginx 的错误日志,看看是否有关于 WebSocket 连接的错误信息。同时,你也应该确保 Nginx 能够正确地代理到 WebSocket 服务器。
  3. 防火墙或安全组问题:如果你的服务器部署在云环境中,可能存在防火墙或安全组规则阻止了 WebSocket 连接。你应该检查这些规则,确保它们允许 WebSocket 连接。
  4. Java-WebSocket 库版本问题:你正在使用的 Java-WebSocket 库版本是 1.5.3,这是一个相对较旧的版本。你应该尝试升级到最新版本,看看问题是否得到解决。

以下是一个修改后的 ClientWs 类,它使用默认的 SSL 上下文而不是自定义的信任所有主机的 SSL 上下文:

public class ClientWs extends WebSocketClient {    public ClientWs(URI serverUri) {        super(serverUri);    }    public ClientWs(URI serverUri, Map<String, String> httpHeaders) {        super(serverUri, httpHeaders);    }    @Override    public void onOpen(ServerHandshake serverHandshake) {        System.out.println("Connected.");    }    @Override    public void onMessage(String s) {        System.out.println("Received message: " + s);    }    @Override    public void onClose(int i, String s, boolean b) {        System.out.println("Connection closed: " + s);    }    @Override    public void onError(Exception e) {        System.err.println("Error: " + e.getMessage());        e.printStackTrace();    }}

你可以尝试使用这个修改后的类来连接 WebSocket 服务器,看看问题是否得到解决。如果问题仍然存在,你应该进一步调试你的代码和服务器配置,找出问题的根源。

 类似资料:
  • 我正在尝试将一个NodeJS脚本移植到第三方服务器,该脚本建立并维护一个Web套接字连接,以使用大猩猩/web套接字包进行Go。在Node脚本中,ping之后会收到一个pong,并且连接会无限期保持活动状态。在Go脚本中,ping/pong可以工作,但大约30秒后服务器会断开连接。 我怀疑使用Go websocket包发送的pings是错误的,但我不能确定这是什么原因。比较运行这些程序时捕获的加密

  • 我正在使用套接字。io,应用程序由AWS提供。我收到一个浏览器控制台错误: websocket.js:54 WebSocket 连接到 'wss://www.tidee.com/socket.io/?EIO=4 客户代码: 服务器代码: 在 AWS 中,安全组接受端口 443,负载均衡器侦听端口 443。 应用程序在本地运行时工作(状态 101),并使用 协议。

  • 问题内容: 我使用NodeJS创建了一个应用程序,并且正在使用ws模块。如果我在本地主机上测试该应用程序,则它可以正常工作,并且连接websockets没有任何问题。现在,我已将应用程序上载到Openshift,当我尝试从客户端访问该应用程序时,它返回,这无法建立与Websocket的连接。 如果我在应用程序中拖入腻子, 则会收到 以下消息: 调试:这种类型的响应一定不能有主体。 忽略传递给end

  • 错误:无法启动连接:错误:WebSocket无法连接。在服务器上找不到连接,endpoint可能不是信号器endpoint,服务器上不存在连接ID,或者存在阻止WebSocket的代理。如果有多台服务器,请检查是否启用了粘性会话。 WebSocketTransport.js:49WebSocket连接到“ws://xxxxxx/生产/网络服务/集线器/spreadhub”失败: Angular.t

  • 从。build/dist/bundle/programs/web.browser中的构建文件中 以下websocket请求将保持挂起状态为101 我没有在流星上写任何代码来运行它到https,我试图通过Nginx处理。添加ssl证书后,从angular尝试通过而不是连接到meteor 请在下面找到我的nginx文件。 任何线索都将不胜感激。

  • 问题内容: 我正在尝试测试安全的网络套接字,但是遇到了麻烦。这是我的测试: 创建后,这是“ ws”的日志: 我没有从打开回来的日志。我正在本地运行该项目,并且当我使用Chrome Advanced Rest Client工具时,可以正常连接。 我想念什么吗?请帮忙。 编辑: 我添加并注销, 我也尝试遵循此代码,但得到相同的错误。 问题答案: 该模块正在拒绝您的自签名证书(正如人们希望的那样)。您可