我有一个使用 FTP 库传输文件的应用程序。接收文件效果很好,主要是发送文件。当我尝试发送应用程序挂起的大文件 (3 MB) 时,就会出现问题。没有错误信息,什么都没有。我已经调试过,发现它停socketWrite0()
在java.net.SocketOutputStream
. 此方法永远不会返回,而只是挂起/阻塞。调用自:
文件开始传输,但第二次调用传输线程在到达 socketWrite0() 方法时停止并挂起。我已经尝试通过在其构造函数中发送一个参数来调整 BufferedOutputStream 中的缓冲区大小,看起来这个大小是多少并不重要,它总是在第二次刷新时停止。
java.io.BufferedOutputStream write() which calls
java.io.BufferedOutputStream flushBuffer() which calls
java.net.SocketOutputStream write() which calls
java.net.SocketOutputStream socketWrite() which calls
java.net.SocketOutputStream socketWrite0()java.io.BufferedOutputStream flushBuffer()
然后我尝试将 Socket setSendBufferSize 设置为 3 000 000,突然间一切正常,BufferedOutputStream 大小为默认值。只要我将此缓冲区大小设置为大于文件传输的文件大小,一切都很好!如果我将缓冲区大小设置为 400 000,则在转移此金额后转移停止。
我无法无限制地增加 BufferedOutputStream 缓冲区。如果我将它设置得太大,也会发生同样的事情:应用程序在 socketWrite0() 处挂起。
- 谁能解释为什么?
- Socket 缓冲区大小可以有多大?极限是多少?
- BufferedOutputStream 缓冲区和 Socket 缓冲区有什么关系?
非常感谢!