我使用AsyncHttpClient(AHC)v2.0beta(使用Netty 4作为提供商)编写客户端,实时流式传输音频,并且需要实时接收服务器数据(流式传输时) 。想象一下,当用户说话时,HTTP客户端会流式传输麦克风的输出,并且如果实时发生,则接收音频转录。简而言之,它是通过HTTP进行双向实时通信(分块多部分请求/响应)。
为了做到这一点,我不得不破解AHC。例如,有一个阻止调用等待org.asynchttpclient.multipart.MultipartBody#read(ByteBuffer buffer)
中的输入数据,该调用是在Netty的io.netty.handler.stream.ChunkedInput
之上实现的。
这有点奏效。问题是我的自定义AsyncHandler在请求完成流式传输之前不会获得onBodyPartReceived()
回调。他们接收事件的时间很长,可能是因为在仍有内容要写的时候,Netty没有阅读。使用网络堆栈,我注意到如果客户端在写入时遇到网络争用,我只能在流式传输时接收服务器响应。
有人可以告诉我这种行为是否是我特定实施的结果(MultipartBody#read()
中的阻塞)或Netty内部实施所施加的架构设计限制?
作为旁注,读取和写入发生在单个IO线程nioEventLoopGroup-X
内。