-1

我用 Java 编写了一个简单的 TFTP 客户端,使用org.apache.commons.net.tftp.TFTPClient. 作为测试服务器,我使用 tftpd64,当它运行时,一切正常。但是当没有任何服务器在运行时,函数sendFile()receiveFile()正在返回。

我正在尝试 catch SocketTimeoutExeption,但函数不会抛出任何东西。我用 Wireshark 检查了数据包,我可以看到一个 Write Request 数据包,但是当然没有响应,因为我没有运行服务器。我如何检查,没有回应?

4

1 回答 1

0

TFTP 是一种 UDP 协议。我们没有连接,也没有错误控制。如果服务器正在运行并做出响应,它会向您的客户端发送一个您不确定会收到的 UDP 数据报。您不能使用 UDP 获得“数据报丢失”信息。超时由您的 TFTP 实施管理。

根据 commons apache code和 apache TFTPClient doc,你已经有了超时管理。

  • setDefaultTimeout(int timeout) :设置打开套接字时使用的默认超时时间(以毫秒为单位)。
  • setSoTimeout(int timeout) :设置当前打开连接的超时时间(以毫秒为单位)。
  • setMaxTimeouts(int numTimeouts) :设置在receiveFile() 或sendFile() 操作期间允许接收尝试超时的最大次数,然后结束尝试重试接收并失败。

  • sendFile 和 receiveFile 抛出 IOException。也许 SocketTimeoutException 永远不会被抛出,因为超时过期不是由套接字管理的。

于 2015-02-03T14:54:39.690 回答