java NIO 关于SocketChannel 循环读取最后一次慢的问题求助。

inberkung 2014-07-07 06:04:15
做了个测试如果用if(channel.read(buffer) != -1) 只读取一次速度很快可以4,5M的流在188ms左右(但是由于不确定是否结束,所以不能从根本上解决问题),但如果用while(channel.read(buffer) != -1),在最后一次时速度很慢基本在15秒左右,网上看了好多资料试了都不行,高手请帮忙,谢谢。

注:如果使用HttpsURLConnection方式循环的话,速度感觉慢在2秒以上。


private void sendPostNew(String host,int port,String path,String params,String charSet)
{
try{
SocketChannel channel = null;
//=================================================
StringBuffer sb = new StringBuffer("POST " + path + " HTTP/1.1\r\n");
sb.append("Host: " + host + "\r\n");
sb.append("Content-Length: " + params.length() + "\r\n");
sb.append("Content-Type: application/x-www-form-urlencoded\r\n");
sb.append("\r\n");
sb.append(params);
sb.append("\r\n");

Charset charset = Charset.forName(charSet);//
InetSocketAddress socketAddress = new InetSocketAddress( host, port);
//step1:打开连接
channel = SocketChannel.open(socketAddress);
//channel.configureBlocking(false);
//step2:发送请求,使用GBK编码
channel.write(charset.encode(sb.toString()));
//step3:读取数据
ByteBuffer buffer = ByteBuffer.allocateDirect((1024*1024*100));


StringBuilder stringBuilder = new StringBuilder((1024));

while(channel.read(buffer) != -1)
{
buffer.flip();// flip方法在读缓冲区字节操作之前调用.
CharBuffer charBuffer =charset.decode(buffer);
// System.out.println(charBuffer);
stringBuilder.append(charBuffer);
System.out.println(stringBuilder);
// 使用Charset.decode方法将字节转换为字符串
buffer.clear();// 清空缓冲
}
channel.close();


} catch (IOException e)
{
// TODO Auto-generated catch block
logger.error(e.toString());
e.printStackTrace();

}

}
...全文
292 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
inberkung 2014-07-08
  • 打赏
  • 举报
回复
这咱问题不会只有我遇到了吧。。。在线等待。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧