这个示例是一个http server,经测试打开htm正常显示,下载几十兆也能下载,但是我下载几百兆文件时,报错如下:
RequestHandler: java.io.IOException: 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。经我进一步查看,发现是ChannelIO.java中的
   long transferTo(FileChannel fc, long pos, long len) throws IOException { return fc.transferTo(pos, len, sc);
    }抛出异常错误~~~~
向各位请教一下,该如何解决这个问题,谢谢~~~~

解决方案 »

  1.   

    写个while循环,把整体拆分成多个分组来传输。
    建议,每个分组的最大长度为512个字节。
      

  2.   

    FileChannel fc = ...; FileChannel sc = ...;
    long pos = ... ; long len = ... ;
    final long MAX_SIZE = 1<<19;//512K个字节
    long curPos = pos;
    while(curPos+MAX_SIZE<pos+len){
      sc.transferTo(fc,curPos,MAX_SIZE);
      curPos += MAX_SIZE;
    }
    sc.transferTo(fc,curPos,pos+len-curPos);
      

  3.   

    我试了一下,是可行的,但是下载速度受到很大影响,而且调整MAX_SIZE大小没什么作用~~~
    请各们高手继续帮忙解决一下,谢谢
      

  4.   

    1.一定要做缓存的,不做缓存的话任何服务器都禁不起你这么折腾2.你觉得效率低,可能是因为底层的代码不适合这种缓存机制,你可以尝试修改底层代码,比如你可以放弃FileChannel,直接操作InputStream之类的,可能会有所改善吧
      

  5.   

    http://www.ibm.com/developerworks/cn/java/j-zerocopy/index.html
    不知是不是跟操作系统有关系