我正在用 Java 编写应用层协议。它基本上只是传输文件。如果传输无法完成或客户端与服务器之间的连接中断,我希望它生成错误消息。
有没有办法从 TCP 获取有关连接或传输状态的信息?还是我需要依赖我在应用程序层使用的东西?如果我可以从 TCP 访问信息,如何?
我正在用 Java 编写应用层协议。它基本上只是传输文件。如果传输无法完成或客户端与服务器之间的连接中断,我希望它生成错误消息。
有没有办法从 TCP 获取有关连接或传输状态的信息?还是我需要依赖我在应用程序层使用的东西?如果我可以从 TCP 访问信息,如何?
TCP 不知道传输的“状态”。这是一个应用程序协议问题,而不是传输层问题。
至于TCP连接的状态,没有办法直接查询。相反,当您尝试读取或写入数据时,您会发现状态。or `write(...) to的结果read(...)
给出了一些关于连接状态的信息。
如果read
or write
call 指示它已读取或写入非零字节数,则连接可能是活动的。
如果read
返回零字节的 a 表示另一端已关闭连接的写入端。但是,我们无法判断是远程应用程序执行了该操作,远程操作系统执行了该操作,还是网络中的某些东西启动了关闭。
如果 a read
orwrite
抛出异常,那么我们可以推断发生了问题并且连接不再可行。在这种情况下可能出现的例外情况包括:
SocketException
- 典型消息“连接重置”或“管道损坏”,通常意味着远程执行了意外的操作,或“套接字关闭”,这意味着应用程序已尝试读取或写入已关闭的连接。SocketTimeoutException
- 通常,如果 aread
花费的时间超过为套接字配置的读取超时时间,就会发生这种情况。不幸的是,它无法告诉您有关超时的根本原因的任何信息。ProtocolException
- 这在理论上对于套接字 i/o 操作是可能的,但此异常通常由应用程序协议代码抛出。不幸的是,这意味着很难向应用程序的用户提供有关传输失败原因的清晰准确的信息。但这是网络连接所固有的。真正的问题是简单/清晰的诊断信息无法在任何地方直接获得。