代码之家  ›  专栏  ›  技术社区  ›  Stu Thompson Helter Scelter

可由techannel.read读取(ByteBuffer dest)读取上限为8KB。为什么?

  •  1
  • Stu Thompson Helter Scelter  · 技术社区  · 15 年前

    我有一些代码:

    1. 从一个 ReadableByteChannel 变成一个 ByteBuffer ,
    2. 注意传输的字节,
    3. 暂停几十到几百毫秒,
    4. 通过 ByteBuffer公司 WritableByteChannel

    一些细节:

    • 两个通道都是TCP/IP套接字。
    • 总的连接读取大小以数十兆字节为单位。
    • 源套接字(该套接字 正在从中获取字节)位于同一台计算机上。
    • HP DL380s上的Debian Lenny 64位
    • Sun Java 1.6.0更新20

    问题是,无论ByteBuffer分配多大 .allocate() .allocateDirect() ,读入ByteBuffer的字节数最大为8KB。我的目标ByteBuffer大小是256KB,这只是正在使用的一小部分(1/32)。大约10%的时间只有2896字节被读入。

    tcp        0 192384 1.2.3.4:8088     1.2.3.4:53404    ESTABLISHED
    tcp6  110144      0 1.2.3.4:53404    1.2.3.4:8088     ESTABLISHED
    

    我试着设置套接字属性,使其有利于带宽而不是延迟,但没有改变。

    Socket socket = new Socket(host.getHostName(), host.getPort());
    socket.setPerformancePreferences(1, 0, 2);  //bw > connection time > latency
    

    当我记录 socket.getReceiveBufferSize() ,它一直报告只有43856字节。虽然它比我想要的小,但仍然超过8KB。(这也不是一个很圆的数字,我早就预料到了。)

    我错过了什么?我能做些什么来纠正它?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Stu Thompson Helter Scelter    15 年前

    好的,我找到问题了!(如果有人有同样的问题,我会回答我自己的问题。)

    我在举例说明 ReadableByteChannel 不是直接从 Socket HttpEntity.getContent() ( Apache HTTP Commons Client InputStream . httpcommons客户机很早就通过 DefaultHttpClientConnection.bind() 方法。我不明白的是,我认为,这个频道是一个 BufferedInputStream

    因此,我的解决办法是抓住 可由Techannel阅读 脱胎换骨 插座 实例。