【问题标题】:Trying to test connection on localhost ports using Socket and get ConnectException尝试使用 Socket 测试本地主机端口上的连接并获取 ConnectException
【发布时间】:2014-04-22 08:54:54
【问题描述】:

我正在编写一个简单的测试 Java 程序,使用 Socket 来测试我本地机器上哪个端口可用于 TCP 服务。这是我的代码:

for (int i = 0; i < 1024; i++) {
    try {
        //test availability
        InetAddress addr = InetAddress.getLocalHost();
        Socket s = new Socket(addr, i);
        System.out.println("There is a server on port " + i + "of localhost.");
    } catch (IOException e){
        e.printStackTrace();
        break;
    }
}

运行时我得到了:

java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at main.PortScanner.main(PortScanner.java:19)

我是 Socket 的新手。我是否需要启动一个 Socket 服务器来响应我的请求? 或者我应该怎么做才能扫描我的端口? 谢谢你的回答。

【问题讨论】:

  • 查看link
  • 感谢@yogx,我尝试以管理员身份运行它:java -Djava.net.preferIPv4Stack=true main.PortScanner,但仍然收到相同的错误消息。也就是说,“ConnectException:连接:地址在本地机器上无效,或者端口在远程机器上无效”对于第一次迭代和“ConnectException:连接被拒绝:连接”异常对于循环的其余部分。

标签: java sockets


【解决方案1】:

您正在尝试建立与端口 0 的客户端连接,但这是不可能的。如果您将服务器端套接字绑定到端口 0,系统将自动分配一个高于 1024 的空闲端口。 因此,服务器套接字永远不会监听端口 0。 不幸的是,我找不到有关此的文档。可能是其他操作系统的行为不同。

你的第二个问题:如果端口上没有任何东西在监听,那么你会得到一个连接异常。

【讨论】:

  • 谢谢。我不应该尝试连接到端口 0,我认为这就是第一个异常消息的方式。但是当我尝试连接到端口 1~1024 时,我仍然得到:“java.net.ConnectException:连接被拒绝:连接”。我应该怎么做才能扫描我的本地保留端口?
  • 看看 Bruno Reis 的回答:stackoverflow.com/questions/11547082/…
  • 谢谢。这对我很有帮助!
【解决方案2】:

您是以 root 或管理员身份运行此程序吗?如果没有,只有这些用户可以打开 0 到 1024 之间端口的套接字。

【讨论】:

  • 谢谢。我试图以管理员身份运行它。但仍然无法正常工作。第一次迭代时出现“ConnectException:连接:地址在本地机器上无效,或者端口在远程机器上无效”,而循环的其余部分出现“ConnectException:连接被拒绝:连接”异常。顺便说一句,我使用的是 windows x64,我在 cmd.exe 中运行它。
猜你喜欢
  • 2018-06-01
  • 2013-07-08
  • 2019-07-15
  • 2014-04-24
  • 2015-10-15
  • 2020-01-20
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
相关资源
最近更新 更多