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

同时有两个 OkHttp 网页插座连接,其中一个连接线程匮乏

薛华奥
2023-03-14

在我在Intellij中运行的spring boot应用程序中,我有一个@Scheduled任务,两个WebSocket流使用OkHttp连接从两个不同的OkHttpClients实例打开到两个不同的服务器。我不认为OkHttpClient中的连接池设置。Builder与此相关,因为OkHttpClient有两个实例。两个websocket流最初都接收一些事件,然后其中一个不再接收任何事件。我还通过打印工作线程的hashcode验证了它们是不同的。[![图片][1]][1]

遗憾的是,我在命令行mvn run上也发现了同样的问题,所以这似乎不是Intellij特有的问题。

如何使两个套接字流上收到的事件持续进行?如果我重用相同的 OkHttp 客户端来创建这两个连接,会有帮助吗?

更新:不想浪费时间等待解决这个问题,我采取了极端的步骤,将两个独立的应用程序分开,每个应用程序都有一个websocket监听器。然而,我面临着同样的问题,其中一个在启动几秒钟后就停止接收任何回调。不能责怪远程服务器,因为如果我单独运行其中任何一个,它永远不会停止接收回调流。我需要它们同时启动并运行,并相互通信。

fwiw,我使用[this][2]客户端库订阅一个WebSocket流,使用[this][3]订阅另一个。第一个endpoint是WSS://stream . binance . com:9443/ws/btcusdt @ agg trade,第二个endpoint是wss://fstream.binance.com,后一个订阅是通过向它发布一个JSON {"method":"SUBSCRIBE "," id":1663348051361," params":"btcusdt@aggTrade"}来建立的。

我已经和服务器endpoint的客户支持人员聊过了,他们无法帮助我,他们只是说,如果我能够单独订阅套接字流就好了,当我同时启动它们时,他们看不出有任何理由让其中一个停止工作。[1]:https://i.stack.imgur.com/T5oia.png[2]:https://github.com/binance-exchange/binance-java-api/blob/master/src/main/java/com/binance/api/client/impl/BinanceApiWebSocketClientImpl.java#L47[3]:https://github.com/Binance-docs/Binance_Futures_Java/blob/master/src/main/java/com/binance/client/impl/WebSocketStreamClientImpl.java#L63

共有2个答案

吕灿
2023-03-14

即使您有stream.binance。com:9443和fstream.binance。com列为2主机:端口,然后可以由单个服务器提供服务。

即使您将这两个客户端分离到它自己的jvm中(排除线程和其他问题),您的clientIp和其他参数也可能使这两个客户端看起来像1个。

我建议尝试通过欺骗客户端IP标头使这2个客户端订阅看起来不同。也许可以设置 X 转发和/或 X 真实 IP。

https://stackoverflow.com/a/67103219/2103767可能会帮助提供这个插座

更新:

您正在发送乒乓球架吗?

根据https://币安-docs . github . io/API docs/futures/en/# web socket-market-streams,你必须发送一个pong帧,否则它会断开客户端。

websocket服务器将每5分钟发送一个ping帧。如果websocket服务器在15分钟内没有收到连接返回的pong帧,连接将被断开。未经请求的pong帧是允许的。

不确定它是否适合您的需求,但您可以收听同一客户的两个频道。

茹正初
2023-03-14

每个WebSocket都有自己的线程。会不会是你的听众有问题?

 类似资料:
  • 背景我正试图为我的java服务器创建一个android客户端应用程序,并让它们使用TCP套接字进行通信。 当我在android设备模拟器上运行我的应用程序时,它的工作原理是什么 当我在手机上运行该应用程序时,我无法正常工作,我在创建套接字时遇到连接超时。 异常 java.net.Connect异常: 无法连接到 /10.0.2.2 (端口 9111): 连接失败: ETIMEDOUT (连接超时)

  • 我是使用节点js(ws库)开发的网页登录服务器 我想将聊天模块添加到android应用程序。我正在为websocket客户端使用okhttp。当从设备连接时,它正在工作。但是当连接第二台设备时,它不工作。只有第一台设备websocket.on(“消息”)事件发射器会做出响应。另一台设备不监听onMessage。只有一台设备监听A. B- 如何配置onMessage在所有设备上工作? java客户端

  • 试图确定是否可以创建一个连接表的查询,表一比表二小,表二有多个匹配表一条目的引用,查询将输出一个连接,其中表一的长度保留,但您只需添加更多列。我不确定这是否有意义,所以这里是我想要的一个例子 更新!! 保持原来的查询并使用PHP处理结果,也获得了很好的性能。让我知道如果你需要我张贴我的代码。

  • 我对连接池的理解是;如果connectionstring完全相同,那么我们重用该连接,而不是建立新的连接。 我的问题是,我正在为并行处理创建许多线程。在这个“虚拟”程序中,我创建了500个线程,并让线程池函数处理这些线程。 步骤是: > < li> 每个线程在SQL中创建一个更新表。(说明更新的时间戳) 然后线程Hibernate1到10秒(随机)。 最后,线程在 SQL 中进行另一次更新(说明结

  • 问题内容: 我正在JPanel中绘制两个形状(圆形),我需要用一条 线将它们连接起来。我这样做是通过简单地获得圆的中点并 相互连接来实现的。 问题在于,现在我需要制作单向线,该单向线 的末尾带有“箭头”,以指出线的前进方向。所以现在我不能 使用圆的中点,因为我需要从 边界到边界相互连接,因此“箭头”可以正确显示。 在我上一次尝试的结果是,没有任何好处: PS:在屏幕截图中,我并不是为了看到 直线的

  • 我使用jsPlumb允许用户构建图形。我允许用户拖动这些元素,所以我为每个endpoint使用锚集合,让jsPlumb在建立连接时从该集合中为我选择“最佳”锚。我遇到的问题是,我可能有多达十几个连接来自任何给定的endpoint,所以当许多人最终选择相同的“最佳”锚点时,这些连接将在视觉上分散注意力——在图中造成拥塞的外观。为了解决这个问题,我想告诉jsPlumb限制任何两个连接在endpoint