1

我们的服务器用于 Nginx 作为 webserver,并添加了 nginx_push_stream的编译模块。之前推流用的是Restful,后来改成Websocket,但是WebSocket有时在客户端或服务器带宽小的时候会丢失。在 2019 年,从 Websocekt 到 Server-Sent Event (SSE) / event-source,例如 event stream 或 text/event-stream,以减少客户端或服务器的损失。

拜托,任何人,对库事件流能够用于 android 客户端和 iPhone 客户端有任何想法。

我已经习惯了 Okhttp 但还没有准备好使用的事件流,RxSSE 无法在 Android 中使用,根本没有响应。

我希望明年 OkHttp 已经为 Android 客户端和 iPhone 客户端更新了 OkHttp-EventSource

4

1 回答 1

3

3天后,Struggling就有了支持Android客户端SSE的搜索库。然后,我发现这个博客Accessing SSE对我实施 SSE 有很大帮助,这也是图书馆 SSE

这个 kotlin 版本的示例实现 SSE,甚至认为库是 java 版本。

1. 准备事件处理程序源

interface DefaultEventHandler : EventHandler {

    @Throws(Exception::class)
    override fun onOpen() {
        Log.i("open","open")
    }

    @Throws(Exception::class)
    override fun onClosed() {
        Log.i("close","close")
    }

    @Throws(Exception::class)
    override fun onMessage(event: String, messageEvent: MessageEvent) {
        Log.i("event", messageEvent.data)
    }

    override fun onError(t: Throwable) {
        Log.e("error", t.toString())
    }

    override fun onComment(comment: String) {
        Log.i("event", comment)
    }
}

class MessageEventHandler : DefaultEventHandler {

    override fun onMessage(event: String, messageEvent: MessageEvent) {
        super.onMessage(event, messageEvent)
        val data = messageEvent.data
        Log.i("message", data)
    }
}

2.实现事件源


import java.net.URI
import java.util.concurrent.TimeUnit

.....
 
fun initEventSource(url: String) {
   val eventHandler = MessageEventHandler()

   try {
     val eventSource: EventSource = EventSource.Builder(handler, URI.create(url))
        .reconnectTimeMs(3000)
        .build()
   
      eventSource.start()

      TimeUnit.SECONDS.sleep(10)
   } catch (e: Exception) {
      Log.e("error", e.toString())
   } 
}

我希望这将是从客户端到服务器的替代方法协议,而不是使用 RESTfull 或 Websocket。当服务器总是向客户端发送数据而不需要客户端的请求作为流时。

我添加了使用库 SSE https://gist.github.com/subhanshuja/9079ec9df0927b1da26ee57cf9da1f26的要点。

于 2019-11-19T11:44:56.823 回答