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