Java 尝试使用套接字在本地主机端口上测试连接并获取ConnectException

Java 尝试使用套接字在本地主机端口上测试连接并获取ConnectException,java,sockets,Java,Sockets,我正在编写一个简单的测试Java程序,使用套接字测试本地机器上哪个端口可用于TCP服务。这是我的密码: for (int i = 0; i < 1024; i++) { try { //test availability InetAddress addr = InetAddress.getLocalHost(); Socket s = new Socket(addr, i); System.out.println("T

我正在编写一个简单的测试Java程序,使用套接字测试本地机器上哪个端口可用于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;
    }
}
for(int i=0;i<1024;i++){
试一试{
//测试可用性
InetAddress addr=InetAddress.getLocalHost();
插座s=新插座(地址,i);
System.out.println(“localhost的端口“+i+”上有一台服务器”);
}捕获(IOE异常){
e、 printStackTrace();
打破
}
}
跑步时我得到:

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)
java.net.ConnectException:connect:地址在本地计算机上无效,或者端口在远程计算机上无效
位于java.net.DualStackPlainSocketImpl.connect0(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(未知源)
位于java.net.AbstractPlainSocketImpl.doConnect(未知源)
位于java.net.AbstractPlainSocketImpl.connectToAddress(未知源)
位于java.net.AbstractPlainSocketImpl.connect(未知源)
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket。(未知源)
位于java.net.Socket。(未知源)
位于main.PortScanner.main(PortScanner.java:19)
我不熟悉插座。我需要启动套接字服务器来响应我的任务吗? 或者我应该做什么来扫描我的端口?
谢谢您的回答。

您是以root用户还是管理员身份运行此程序?否则,只有这些用户才能打开端口介于0和1024之间的套接字。

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


您的第二个问题:如果端口上没有侦听内容,则会出现连接异常。

谢谢。我试着以管理员的身份运行它。但仍然不起作用。在第一次迭代中,我得到了“ConnectException:connect:地址在本地计算机上无效,或者端口在远程计算机上无效”以及循环其余部分的“ConnectException:连接被拒绝:connect”异常。顺便说一句,我使用的是windows x64,我在cmd.exe中运行了它。谢谢@yogx,我尝试以管理员身份运行它:java-Djava.net.preferIPv4Stack=true main.PortScanner,但仍然收到相同的错误消息。也就是说,对于第一次迭代,“ConnectException:connect:地址在本地计算机上无效,或者端口在远程计算机上无效”,对于循环的其余部分,“ConnectException:Connection Rejected:connect”异常。谢谢。我不应该尝试连接到端口0,我认为第一个异常消息就是这样出现的。但当我尝试连接到端口1~1024时,仍然会得到:“java.net.ConnectException:Connection-densed:connect”。我应该做什么来扫描我的本地保留端口?请看Bruno Reis的回答:谢谢。那真的帮了我的忙!