我正在用Java编写应用程序层协议。它基本上只是传输文件。如果传输无法完成或客户端与服务器之间的连接中断,我希望它生成错误消息。
是否有办法从TCP获取有关连接或传输状态的信息?还是我需要依靠我在应用程序层上的工作?如果我可以从TCP访问信息,怎么办?
TCP不知道传输的“状态”。那是应用协议问题,而不是传输层问题。
关于TCP连接的状态,无法直接查询。而是在尝试读取或写入数据时查明状态。 read(...)
或`write(...)的结果提供有关连接状态的一些信息。
如果read
或write
调用指示已读取或写入了非零字节数,则该连接可能处于活动状态。
如果返回零字节的read
指示另一端已关闭其连接的写侧。但是,我们无法确定是远程应用程序执行了此操作,还是远程操作系统执行了此操作,还是网络中的某个操作引发了关闭。
如果read
或write
引发异常,则可以推断出发生了问题,并且连接不再可行。在这种情况下可能出现的异常包括:
SocketException
-典型的消息“连接重置”或“管道断开”,这通常意味着遥控器进行了意外操作,或者“套接字关闭”,这意味着应用程序已尝试在该连接上进行读写已关闭。SocketTimeoutException
-通常,如果read
花费的时间超过为套接字配置的读取超时,则会发生这种情况。不幸的是,它不能告诉您有关超时的基础ProtocolException
-从理论上讲,这对于套接字I / O操作是可行的,但是此异常通常由应用程序协议代码引发。anywhere