akka-http发送连续分块的http响应(流)

时间:2015-10-14 10:46:10

标签: scala akka http-streaming akka-stream akka-http

我有import akka.actor.ActorSystem import akka.stream.ActorMaterializer import akka.stream.scaladsl.Sink import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpMethods._ import akka.http.scaladsl.model._ import scala.concurrent.Future class Server extends Runnable { def run() = { implicit val system = ActorSystem("server") implicit val materializer = ActorMaterializer() val serverSource = Http().bind(interface = "localhost", port = 8200) val requestHandler: HttpRequest => HttpResponse = { case HttpRequest(GET, Uri.Path("/stream"), _, _, _) => HttpResponse(entity = HttpEntity(MediaTypes.`text/plain`, "test")) } val bindingFuture: Future[Http.ServerBinding] = serverSource.to(Sink.foreach { connection => connection handleWithSyncHandler requestHandler }).run() } } 客户端和服务器的粗略测试示例。

Server.scala:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{Uri, HttpRequest}
import akka.stream.ActorMaterializer

object Client extends App {

    implicit val system = ActorSystem("client")
    import system.dispatcher

    new Thread(new Server).start()

    implicit val materializer = ActorMaterializer()
    val source = Uri("http://localhost:8200/stream")
    val finished = Http().singleRequest(HttpRequest(uri = source)).flatMap { response =>
        response.entity.dataBytes.runForeach { chunk =>
            println(chunk.utf8String)
        }
    }

}

Client.scala:

Server

目前HttpResponse只回复一次"测试"。

如何更改Server中的RPY_TABLE_*以发送"测试"每1秒钟在无限循环中分块(流)?

1 个答案:

答案 0 :(得分:4)

找到答案。

Server.scala:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Sink}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import scala.concurrent.Future
import scala.concurrent.duration._

class Server extends Runnable {

    def run() = {

        implicit val system = ActorSystem("server")
        implicit val materializer = ActorMaterializer()

        val serverSource = Http().bind(interface = "localhost", port = 8200)

        val requestHandler: HttpRequest => HttpResponse = {
            case HttpRequest(GET, Uri.Path("/stream"), _, _, _) =>
                HttpResponse(entity = HttpEntity.Chunked(ContentTypes.`text/plain`, Source(0 seconds, 1 seconds, "test")))
        }

        val bindingFuture: Future[Http.ServerBinding] = serverSource.to(Sink.foreach { connection =>
            connection handleWithSyncHandler requestHandler
        }).run()

    }

}