3

我有一个使用 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() 处挂起。

  1. 谁能解释为什么?
  2. Socket 缓冲区大小可以有多大?极限是多少?
  3. BufferedOutputStream 缓冲区和 Socket 缓冲区有什么关系?

非常感谢!

4

1 回答 1

0

听起来另一端没有从套接字读取,所以套接字阻塞了,如果你写了另一端(应该从套接字读取的那一侧),那么问题很可能出在该代码中。如果不是,并且您正在尝试实现 FTP 标准并与已知的工作 FTP 服务器通信,那么您在客户端实现它的方式很可能存在问题(例如,您正在尝试写入文件数据,但远程端是不期待它并且期待控制消息或其他东西)。

于 2012-10-24T23:39:42.677 回答