1

已解决: 问题是“病毒”或类似劫持端口的东西。OBS:病毒劫持了端口,端口没有出现在 netstat -an 或正在使用的端口的 TCPView 上。

我使用了 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;
    }
}

响应是错误的。

抛出的异常是:

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

但我检查控制台/提示-dos:

netstat -ano 

该端口不在列表中

我没有使用任何防火墙,我禁用了它

我是否在做正确的事情来查看端口是否可用?

这是一个“不可用”的端口吗?

4

2 回答 2

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;
    }
}

获取当前的 nestat -ano 结果:

  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:445 监听或 TCP 服务处于活动状态并且它正在监听 192.168.184.1:139 时,当你测试PortScan 127.0.0.1 445或时PortScan 192.168.184.1 139,它会连接并说“端口活动: 真的”:

当给定端口没有服务时(可能未激活或阻塞);假设“127.0.0.1:446”,它将捕获“连接被拒绝”并说“端口活动:假”:

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

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

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

        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();
        }

更新:

当您尝试再次连接另一个运行时,请确保上一次运行(涉及服务器代码部分)在 Eclipse 中正确关闭。检查Eclipse 的调试视图并在测试之前关闭有问题的先前运行。否则,BindException当您尝试在已激活的同一端口上建立服务器代码时,您将得到一个。

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

netstat -ano | find "62974"
于 2012-04-11T02:59:17.280 回答
-1

问题是您试图打开端口进行两次侦听。Serversocket 接受 TCP 连接,而 DatagramSocket 接受 UDP 数据报。您不能两次打开同一个端口。这解释了您得到的绑定 IO 异常。

于 2012-04-11T02:00:32.563 回答