Java:如何确认端口是否打开?

时间:2017-04-04 17:00:53

标签: java networking tcp network-programming port

我看过其他帖子,但没有一个是具体的。如果它是重复的,请将其标记为,我将删除它。

我想知道如何确认TCP端口是否打开......显然,我正在创建一个套接字并将connect()调用到指定的InetAddress和端口号。我的测试显示,如果端口未打开,则抛出IOException,如果端口打开,则没有异常。

异常捕获检查端口是否打开的唯一方法? 另外,或许更重要的是,如果没有抛出异常并且执行connect()之后的行,这是否意味着整个TCP连接是完整且成功的?我问,因为在某些情况下显然isConnected()并不总是返回预期的结果,所以我不确定它是否可靠。我是否需要实际读取或写入端口以进行确认?

1 个答案:

答案 0 :(得分:0)

Java NIO提供异步套接字编程,它将异常作为参数返回,这意味着如果套接字未打开则将抛出异常。如果你有很多嵌套调用并且关心堆栈跟踪的大小,这可能是更好的选择。

低级别(内核)套接字连接功能在TCP / IP握手完成之前不会返回,因此您可以假设套接字已打开并可以使用。无法知道套接字是否真正打开,因为例如可能是连接另一端的服务中断,这可能会阻止另一端通知您的应用程序连接已关闭。因此,如果您已收到FIN数据包但无法知道它是否已打开,则可以知道连接是否已关闭。如果建立连接,您可以假设它已打开但没有应用程序层握手,则无法知道连接是否曾打开过。一些应用程序层协议发送频繁的无操作消息以确保套接字仍处于打开状态,这有助于根据未收到在特定超时时间内收到数据包的ACK(nowledgement)来确定连接是否已关闭,但网络延迟可能事实上导致超时给出误报。使用超时你假设它是关闭的,并且在由于握手而连接之后你假设它是打开的,但唯一确定的是如果你在TCP层收到一条FIN消息,那么套接字肯定是关闭的。