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

问题描述

做了个测试如果用if(channel.read(buffer)!=-1)只读取一次速度很快可以4,5M的流在188ms左右(但是由于不确定是否结束,所以不能从根本上解决问题),但如果用while(channel.read(buffer)!=-1),在最后一次时速度很慢基本在15秒左右,网上看了好多资料试了都不行,高手请帮忙,谢谢。注:如果使用HttpsURLConnection方式循环的话,速度感觉慢在2秒以上。privatevoidsendPostNew(Stringhost,intport,Stringpath,Stringparams,StringcharSet){try{SocketChannelchannel=null;//=================================================StringBuffersb=newStringBuffer("POST"+path+"HTTP/1.1rn");sb.append("Host:"+host+"rn");sb.append("Content-Length:"+params.length()+"rn");sb.append("Content-Type:application/x-www-form-urlencodedrn");sb.append("rn");sb.append(params);sb.append("rn");Charsetcharset=Charset.forName(charSet);//InetSocketAddresssocketAddress=newInetSocketAddress(host,port);//step1:打开连接channel=SocketChannel.open(socketAddress);//channel.configureBlocking(false);//step2:发送请求,使用GBK编码channel.write(charset.encode(sb.toString()));//step3:读取数据ByteBufferbuffer=ByteBuffer.allocateDirect((1024*1024*100));StringBuilderstringBuilder=newStringBuilder((1024));while(channel.read(buffer)!=-1){buffer.flip();//flip方法在读缓冲区字节操作之前调用.CharBuffercharBuffer=charset.decode(buffer);//System.out.println(charBuffer);stringBuilder.append(charBuffer);System.out.println(stringBuilder);//使用Charset.decode方法将字节转换为字符串buffer.clear();//清空缓冲}channel.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocklogger.error(e.toString());e.printStackTrace();}}

解决方案

解决方案二:
这咱问题不会只有我遇到了吧。。。在线等待。

时间: 2024-10-01 20:04:42

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

java Nio 异步操作(四)channel

Java NIO 的核心组成部分: 1.Channels 2.Buffers 3.Selectors 我们首先来学习Channels(java.nio.channels): 通道 1)通道基础 通道(Channel)是java.nio的第二个主要创新.它们既不是一个扩展也不是一项增强,而是全新.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据. channel的jdk源码: 1 2 3 4 5

java nio 操作(2)异步阻塞 socket实现

一.同步阻塞IO         BIO就是阻塞式的IO,网络通信中对于多客户端的连入,服务器端总是与客户端数量一致的线程去处理每个客户端任务,即,客户端与线程数1:1,并且进行读写操作室阻塞的,当有你成千上完的客户端进行连接,就导致服务器不断的建立新的线程,最后导致低通资源不足,后面的客户端不能连接服务器,并且连接入的客户端并不是总是在于服务器进行交互,很可能就只是占用着资源而已. 二.伪异步IO    伪异步IO对同步IO进行了优化,后端通过一个线程池和任务队列去处理所有客户端的请求,当用完

JAVA NIO存在的问题

    JAVA 包含最新的版本JDK1.8的NIO存在一些问题,这些问题需要在编写NIO程序时要格外关注: NIO跨平台和兼容性问题     NIO是底层API,它的实现依赖于操作系统针对IO操作的APIs. 所以JAVA能在所有操作系统上实现统一的接口,并用一致的行为来操作IO是很伟大的.     使用NIO会经常发现代码在Linux上正常运行,但在Windows上就会出现问题.所以编写程序,特别是NIO程序,需要在程序支持的所有操作系统上进行功能测试,否则你可能会碰到一些莫明的问题.   

java NIO中的Reactor相关知识汇总 (转)

一.引子     nio是java的IO框架里边十分重要的一部分内容,其最核心的就是提供了非阻塞IO的处理方式,最典型的应用场景就是处理网络连接.很多同学提起nio都能说起一二,但是细究其背后的原理.思想往往就开始背书,说来说去都是那么几句,其中不少人并不见的真的很理解.本人之前就属于此类,看了很多书和博客,但是大多数都只是讲了三件套和怎么使用,很少会很细致的讲背后的思想,那本次我们就来扒一扒吧.     很多博客描述nio都是这么说的:基于Reactor模式实现的多路非阻塞高性能的网络IO.那

Java NIO原理图文分析及代码实现

[本文转载于Java NIO原理图文分析及代码实现] 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考博客:http://weixiaolu.iteye.com/blog/

Java NIO原理图文分析及代码实现_java

前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考博客:http://weixiaolu.iteye.com/blog/1477774 )和java NIO.为了能够正确地分析

基于java.nio.channels的编程实践-I

服务端代码 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketCh

基于java.nio.channels的编程实践-II

介绍 为了提供并发处理效率,把用户的请求连接随机分配到线程池的线程进行处理,hbase也是采用同样的方式处理用户请求的 客户端代码可以参考:基于java.nio.channels的编程实践-I 代码 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.chan

java nio scoket的连接问题

问题描述 下面是一个测试例子,主要是连接地址不同,请在注释的地方切换分别测试.希望能详细讲解一下这两个过程,特别是连127.0.0.1这个1) InetSocketAddress addr = new InetSocketAddress("www.baidu.com", 80); 2) //InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 80);/** * NIO_baidu.java * *