【问题标题】:How to access information about network from TCP?如何从 TCP 访问有关网络的信息?
【发布时间】:2020-03-07 21:37:57
【问题描述】:

我正在用 Java 编写应用层协议。它基本上只是传输文件。如果传输无法完成或客户端和服务器之间的连接中断,我希望它生成错误消息。

有没有办法从 TCP 获取有关连接或传输状态的信息?还是我需要依赖我在应用程序层使用的东西?如果我可以从 TCP 访问信息,如何?

【问题讨论】:

  • 如果发生什么事情你会得到一个异常......如果异常不够,你也可以创建超时。

标签: java tcp ftp network-protocols application-layer


【解决方案1】:

TCP 不知道传输的“状态”。这是一个应用程序协议问题,而不是传输层问题。

关于TCP连接的状态,没有办法直接查询。相反,当您尝试读取或写入数据时,您会发现状态。 read(...) 或 `write(...) 的结果提供了有关连接状态的一些信息..

  • 如果readwrite 调用表明它已读取或写入非零字节数,则连接可能是活动的。

  • 如果返回零字节的read 表示另一端已关闭连接的写入端。但是,我们无法判断是远程应用程序执行了该操作,远程操作系统执行了该操作,还是网络中的某些东西启动了关闭。

  • 如果readwrite 抛出异常,那么我们可以推断出现问题并且连接不再可行。在这种情况下可能出现的例外情况包括:

    • SocketException - 典型消息“连接重置”或“管道损坏”,这通常意味着遥控器做了一些意想不到的事情,或者“套接字关闭”,这意味着应用程序试图读取或写入 它 关闭。
    • SocketTimeoutException - 通常,如果read 花费的时间超过为套接字配置的读取超时时间,就会发生这种情况。不幸的是,它无法告诉您有关超时的潜在原因的任何信息。
    • ProtocolException - 理论上这对于套接字 i/o 操作是可能的,但此异常通常由应用程序协议代码引发。

很遗憾,这意味着向您的应用程序用户提供有关传输失败原因的清晰准确的信息是很困难的。但这是网络连接所固有的。真正的问题是,简单/清晰的诊断信息无法在任何地方直接获得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多