How to receive infinite chunked data in okhttp

Viewed 17

I have a Http server. When client send a http request to the server, the server side will hold the http connection and send chunked string infinite to the client. I know it will be better using websocket in today, but it is a old project, and I can't change the server side code.

// server.kt
package com.example.long_http

import io.vertx.core.AbstractVerticle
import io.vertx.core.Promise
import io.vertx.core.Vertx

class MainVerticle : AbstractVerticle() {

  override fun start(startPromise: Promise<Void>) {
    vertx
      .createHttpServer()
      .requestHandler { req ->
        var i = 0
        req.response().setChunked(true).putHeader("Content-Type", "text/plain")
        val timer = vertx.setPeriodic(2000) {
          req.response().write("hello ${System.currentTimeMillis()}")
          println("write ${System.currentTimeMillis()}")
        }

        req.response().closeHandler {
          vertx.cancelTimer(timer)
          println("close")
        }
      }
      .listen(8888) { http ->
        if (http.succeeded()) {
          startPromise.complete()
          println("HTTP server started on port 8888")
        } else {
          startPromise.fail(http.cause());
        }
      }
  }
}

fun main() {
  Vertx.vertx().deployVerticle(MainVerticle())
}

I try to receive chunked string using okhttp, but it dont work.

// client.kt
package com.example.long_http

import okhttp3.*
import java.io.IOException

fun main() {
  val client = OkHttpClient()
  val request = Request.Builder().url("http://localhost:8888").build()
  client.newCall(request).enqueue(handler())
}

class handler : Callback {
  override fun onFailure(call: Call, e: IOException) {
    e.printStackTrace()
  }

  override fun onResponse(call: Call, response: Response) {
    println("onResponse")
    val stream = response.body!!.byteStream().bufferedReader()
    while (true) {
      var line = stream.readLine()
      println(line)
    }
  }

}
0 Answers
Related