问题描述:搭建了Netty服务器,将文件信息转换为数据流发送出去,然后通过okhttp去请求,response中有回复,但数据流却没有过来
Netty服务端代码:
mServerBootstrap.group(mBossGroup, mWorkerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
SSLEngine engine = WebSocketUtils.createSslContext().createSSLEngine();
engine.setUseClientMode(false);
pipeline.addLast(new SslHandler(engine));
pipeline.addLast(new HttpServerCodec(4096, 8192, ArchiveStream.BUFFER_SIZE));
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new LoggingHandler());
pipeline.addLast(new ChunkedWriteHandler());
pipeline.addLast(new SimpleChannelInboundHandler<Object>() {
@Override /////216
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
FullHttpRequest fullHttpRequest = (FullHttpRequest) msg;
handleDownload(ctx, fullHttpRequest);
}
});
}
});
void handleDownload(ChannelHandlerContext ctx, FullHttpRequest fullHttpRequest) {
final ParcelFileDescriptor[] pipes = ParcelFileDescriptor.createPipe();
final InputStream pipeIn = new BufferedInputStream(new FileInputStream(pipes[0].getFileDescriptor()));
final OutputStream pipeOut = new BufferedOutputStream(new FileOutputStream(pipes[1].getFileDescriptor()));
mExecutor.execute(new Runnable() {
@Override
public void run() {
InputStream is = null;
String path = Environment.getExternalStorageDirectory().getPath() + File.separator + Environment.DIRECTORY_DOWNLOADS;
File file = new File(path + File.separator + "a.txt");
is = new FileInputStream(file);
byte[] buffer = new byte[ArchiveStream.BUFFER_SIZE]; /////623
int N;
while (true) {
try {
N = is.read(buffer);
if (N < 0) break;
pipeOut.write(buffer, 0, N);
} catch (Exception e) {
Log.d(TAG, "read exception");
break;
}
}
}
});
DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
response.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
ctx.write(response);
ctx.writeAndFlush(new HttpChunkedInput(new ChunkedStream(pipeIn)));
}
Okhttp请求代码
Request request = new Request.Builder()
.url("https://" + "10.20.0.148" + ":" + "50000" +"/download?taskId=" + "15802749896")
.get().build();
Log.d(TAG, "download request :" + request);
mOkHttp.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure call= " + call , e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse call=" + call + ", reponse=" + response);
try {
final InputStream is = response.body().byteStream();
if (is == null) {
System.out.println("is null");
return;
}
String path = Environment.getExternalStorageDirectory().getPath() + File.separator + Environment.DIRECTORY_DOWNLOADS;
File file = new File(path + File.separator + "a.txt");
byte[] buffer = new byte[ArchiveStream.BUFFER_SIZE];
try (OutputStream os = new FileOutputStream(file)){
while (true) {
int N = -1;
N = is.read(buffer);
System.out.println("read N=" + N);
if ( N < 0) break;
os.write(buffer, 0, N);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} finally {
response.close();
}
}
});
最后出现的问题是,okhttp中response中有回复,但获取到的数据流为空,log信息为:
onResponse call=okhttp3.RealCall@86ad38b, response=Response{protocol=http/1.1, code=200, message=OK, url=https://10.20.0.148:50000/download?taskId=15802749896}
read N=-1
这一端代码也是借鉴的已经可以正常获取数据的代码,但我这里一直无法获取到数据流。
是否有朋友知道问题出在哪里,请求告知,感激不尽
pipeOut.write(buffer, 0, N);
服务端write完数据,flush一下,或者pipeOut.close()
如有疑问,可进一步沟通,
如有帮助,请采纳,十分感谢!
原因
有没有可能请求就没有正确获取到返回结果?
解决方法
查看下response
返回的状态码是200吗?
如果不是的话,那么就是接口请求错误,请注意URL、和参数信息是否正确。
如有问题及时沟通