Java:端口不可用(在Windows 7上)

时间:2012-04-11 01:28:51

标签: java sockets port

解决: 问题是"病毒"或类似的东西劫持港口。 OBS:病毒以端口没有出现在netstat -an或正在使用的端口的TCPView上的方式劫持了por。

我使用AVG防病毒软件删除病毒。 另一个杀毒软件没有用,只是AVG。


我做了这个程序来检查端口是否可用:

package com.test;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.ServerSocket;

public class Test {
    public static void main(String[] args) {
        System.out.println("Port available: " + available(62974));
    }
    public static boolean available(int port) {
        ServerSocket ss = null;
    try {
        ss = new ServerSocket(port);
        ss.setReuseAddress(true);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (ss != null) {
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return false;
    }
}

回复 false

抛出的异常是:

java.net.BindException: Address already in use: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
    at java.net.ServerSocket.bind(ServerSocket.java:328)
    at java.net.ServerSocket.<init>(ServerSocket.java:194)
    at java.net.ServerSocket.<init>(ServerSocket.java:106)
    at com.dgs.test.Test.available(Test.java:16)
    at com.dgs.test.Test.main(Test.java:9)

我正在使用此端口:62​​974

但是我用:

检查Console / prompt-dos
netstat -ano 

端口不在列表中

我没有使用任何防火墙,我将其停用

我是否正确地查看该端口是否可用?

这是&#34;不可用&#34;端口?

2 个答案:

答案 0 :(得分:0)

在本地或远程测试活动TCP / UDP端口时,您的代码应该尝试成为客户端而不是服务器。

package com.test;

import java.io.IOException;
import java.net.Socket;

public class PortScan {
    public static void main(String[] args) {
        if (args.length > 0 ){
            System.out.println("Port active: " + available(args[0], args[1]));
        }
        else System.out.println("Usage: PortScan <ip> <port>");
    }

    public static boolean available(String ip, String port) {
        boolean status = false;
        Socket ss = null;
        try {
            ss = new Socket(ip, Integer.parseInt(port));
            status = true; //there is a listening port 
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return status;
    }
}

拿这个当前的巢穴 - 结果:

  TCP    192.168.72.1:139       0.0.0.0:0              LISTENING       4
  TCP    192.168.184.1:139      0.0.0.0:0              LISTENING       4
  UDP    0.0.0.0:445            *:*                                    4

当已经有UDP服务处于活动状态但它没有在127.0.0.1:454监听或TCP服务处于活动状态并且正在监听192.168.184.1:139时,当您测试PortScan 127.0.0.1 445或{时{1}},它将连接并说“Port active:true”:

当给定端口没有服务时(可能没有活动或被阻止);让我们说“127.0.0.1:446”,它将捕获“拒绝连接”并说“端口活动:错误”:

PortScan 192.168.184.1 139

但是,你需要检查它拒绝的原因;是真的没有活动还是被防火墙阻止了?这是一个棘手的问题,你需要找出来。

之后,您可以编写代码成为服务器并尝试在免​​费/非活动端口上建立自己,如下所示:

java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(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 com.test.PortScan.available(PortScan.java:18)
    at com.test.PortScan.main(PortScan.java:9)
Port active: false

<强>更新

当您尝试再次与另一次运行连接时,请确保在Eclipse中正确关闭了上一次运行(涉及服务器代码部分)。检查Eclipse的调试视图并在测试之前关闭违规的先前运行。否则,当您尝试在已经处于活动状态的同一端口上建立服务器代码时,您将获得 ServerSocket serverSocket = null; Socket socket = null; try { serverSocket = new ServerSocket(Integer.parseInt(port)); serverSocket.setReceiveBufferSize(2048); serverSocket.setSoTimeout(0); serverSocket.setReuseAddress(true); socket = serverSocket.accept(); } catch (NumberFormatException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } //do something here in a loop try { socket.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }

要检查服务器端口是否已建立,请使用:

BindException

答案 1 :(得分:-1)

问题是您正在尝试打开端口以进行两次侦听。 Serversocket接受TCP连接,而DatagramSocket接受UDP数据报。您无法两次打开相同的端口。这解释了您获得的绑定IO异常。