如何使用 OkHttp 的模拟网络服务器发送流式响应?

How can I send a streamed response using OkHttp's mockwebserver?

将文件内容从服务器返回给客户端的典型流程是:

1.) 获取文件的输入流 2.) 将流的块写入打开的套接字 3.) 关闭输入流

当使用 OkHttp 的 mockwebserver 时,MockResponse 只接受 Okio 缓冲区。这意味着我们必须在发送之前将整个输入流内容读入缓冲区。如果文件太大,这可能会导致 OutOfMemory 异常。有没有一种方法可以在不使用双工响应的情况下完成我上面概述的逻辑流程,或者我应该使用另一个库?这是我目前在 kotlin 中发送文件的方式:

 val inputStream = FileInputStream(file)

 val source = inputStream.source()

 val buf = Buffer()
 buf.writeAll(source.buffer())

 source.close()

 val response = HTTP_200
 response.setHeader("Content-Type", "video/mp4")
 response.setBody(buf)

 return response
 // Dispatch the response, etc...

这是MockWebServer的设计限制,保证服务端没有IOExceptions。如果您的响应大于您可以保留在内存中的响应,MockWebServer 是不适合这项工作的工具。