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

如何断开OkHttp3 sse连接?

罗翰
2023-03-14

我试图创建一个客户机,该客户机可以使用SSE(服务器发送的事件)从服务器接收事件,我使用OkHttp3和OkHttp3-sse库(com.squareup.OkHttp3:OKHTTP:4.1.0&com.squareup.OkHttp3:OKHTTP-SSE:4.1.0)来实现这一点。我可以连接到服务器并接收事件,但在某个时候,我想断开客户端并关闭我的应用程序。这就是问题所在。连接被关闭,但应用程序没有关闭,这可能是由于ConnectionPool没有关闭。

由于几乎没有任何关于OkHttp3-sse库使用的文档,我试图从代码中反向工程操作。我试过:

  • 调用realeventsource.cancel(),它正在断开连接,但挂在线程上
  • 调用OKHttpClient.dispatcher().CancelAll(),它也正在断开连接,但仍然挂在线程上
  • 调用response.close(),并将其传递给eventsourcelistener.onopen()

作为另一种选择,我查看了https://github.com/heremaps/oksse,其中有realserversentevent.close()调用,它正在执行我所期望的操作。它关闭连接并停止所有线程,从而使应用程序完全关闭。我查看了RealServersentEvent类的实现,以了解该实现与RealEventSource有何不同。我认为区别在于读取循环的条件:

realeventsource行https://github.com/square/okhttp/blob/master/okhttp-sse/src/main/java/okhttp3/internal/sse/realeventsource.kt#l75:

      try {
        listener.onOpen(this, response)
        while (reader.processNextEvent()) {
        }
      } catch (e: Exception) {
        listener.onFailure(this, e, response)
        return
      }

realserversentevent行https://github.com/heremaps/oksse/blob/master/src/main/java/com/here/oksse/realserversentevent.java#l94:

            listener.onOpen(this, response);

            //noinspection StatementWithEmptyBody
            while (call != null && !call.isCanceled() && sseReader.read()) {
            }

OKSSE实现包括如果在循环中调用.iscanceled()的条件,其中OKHTTP3-SSE不调用。我怀疑这导致OKHTTP3-SSE无法退出,但我可能错了。

或者,我是在监督预定的断开方式吗?

共有1个答案

田易安
2023-03-14

您正确地使用了API,当调用被取消时,OkHttp应该会导致读取失败,并出现IOException。显然,这种情况并没有发生,我认为这是OKHTTP中的一个bug。

下一步:向OKHTTP报告bug。如果你能用一个可执行的测试用例这样做,我会确保这个问题很快得到修复。

 类似资料:
  • 问题内容: StackExchange.Redis的“ 基本用法”文档解释说,该方法是长期存在的,有望重新使用。 但是,当与服务器的连接断开时该怎么办?是否自动重新连接,或者是否有必要像此答案一样编写代码(引用该答案): 上面的代码是处理断开连接恢复的好方法,还是实际上会导致多个实例?同样,该属性应如何解释? [另外:我相信上面的代码是惰性初始化的一种非常糟糕的形式,尤其是在多线程环境中-请参阅

  • python爬取过程中如何才能强制断开close连接,确保每次ip都切换成功?

  • 服务器上有NiFi和NiFi-Registry,没有连接,我不能通过本地NiFi实例连接到NiFi-Registry,但我可以通过远程桌面访问NiFi和NiFi-Registry。 另一个版本的NiFi和NiFi-Registry安装在我的本地开发系统上。有没有办法离线更新(同步)远程NIFI-注册表流并将新的更新应用到远程NIFI?

  • 断开mqtt连接,前提是必须已经通过Iot_id,Iot_pwd建立过一次mqtt连接。 请求方式: "|4|1|4|\r" 返回值: "|4|1|4|1|\r" 断开成功 "|4|1|4|2|\r" 断开失败 Arduino样例: softSerial.print("|4|1|4|\r");

  • 问题内容: 我正在使用HAProxy在子域上将请求发送到node.js应用程序。 我无法使WebSockets正常工作。到目前为止,我只能使客户端建立WebSocket连接,但是之后很快就会断开连接。 我在ubuntu上。 我一直在使用的各种版本和。客户端是Safari或Chrome的最新版本。HAProxy版本是1.4.8 这是我的HAProxy.cfg 我已经拖网和邮件列表,但无法获得任何建议

  • 问题内容: 我遇到的情况是,Java程序与服务器建立了长期运行的TCP / IP连接,并且该连接的功能与文档中所述的完全相同,除了我无法控制的环境中的一件事。 该服务器会在每个星期六重新启动,但是由于某种原因,该信息无法正确传达给我的客户端,因此连接会一直挂起,永远等待响应。这与过时的JDBC连接完全相同,在服务器和客户端之间的某些路由器发现该连接处于空闲状态,并在没有通知的情况下将其丢弃。 我需