Java从PID获取TCP IP地址

时间:2014-04-14 06:30:48

标签: java tcp

我有一个小应用程序,我在其中检查应用程序是否正在运行,如果它正在运行我得到进程的PID然后尝试获取它打开的TCP连接的IP地址,但即使有多个不同的程序我始终得到0.0.0.0:port而不是实际的IP地址,在Windows上打开资源监视器会显示正确的IP。在CMD中手动运行netstat也只能给我0.0.0.0:port

有没有办法获得资源监视器中显示的正确IP?

命令:"netstat -an -p tcp -o" 这是我在java中得到它的方式:

try {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec(appConstants.NETSTAT_COMMAND);

            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String inputLine = "";
            serverIPAddress = "";
            while ((inputLine = in.readLine()) != null) {
                if (inputLine.contains(appPIDNumber)) {
                    serverIPAddress = inputLine.substring(31, 54);
                    System.out.println("IP before edit: " + serverIPAddress);
                    if (serverIPAddress.equalsIgnoreCase("0.0.0.0:0")
                            || serverIPAddress.contains("0.0.0.0:0")
                            || serverIPAddress.equalsIgnoreCase("0.0.0.0")
                            || serverIPAddress.contains("0.0.0.0")
                            || serverIPAddress.equalsIgnoreCase("127.0.0.0")
                            || serverIPAddress.contains("127.0.0.0")
                            || serverIPAddress.equalsIgnoreCase("127.0.0.1")
                            || serverIPAddress.contains("127.0.0.1")
                            || serverIPAddress.equalsIgnoreCase("")) {
                        serverIPAddress = null;
                        System.out.println("IP ADDRESS FAIL");
                        break;
                    }
                    if (serverIPAddress.contains(":")) {
                        serverIPAddress = serverIPAddress.substring(0, serverIPAddress.lastIndexOf(":")).trim();
                        System.out.println("CORRECT IP ADDRESS: " + serverIPAddress);
                    }
                }
            }

        } catch (IOException e) {
            LoggingUtils.LogExceptions(LoggingConstants.ERROR, e.toString());
        }
        return serverIPAddress;
    }

2 个答案:

答案 0 :(得分:0)

netstat只会显示已建立连接的外部IP地址,但不会显示仍然只在本地侦听的连接。但听起来你知道这一点,并且正在寻找已建立的联系。

我的猜测是你的问题可能是由inputLine.contains(appPIDNumber)造成的。可能是appPIDNumber出现在较早的行中吗?也许作为端口号码?您应该具体检查PID列中的条目是否与您的PID匹配,而不仅仅是该行的任何部分。即使这不会立即导致您的错误,但如果PID与列表开头的某个侦听端口匹配,则代码中的错误仍会导致其随机失败。

也许尝试if (inputLine.trim().endsWith(" "+appPIDNumber)) {,看看是否有帮助。

答案 1 :(得分:0)

  

它打开的TCP连接的IP地址

如果你指的是它侦听的TCP IP:端口,除非程序绑定到特定的IP地址和端口,否则它将是0.0.0.0:xxx,这不是通常。但是如果进程位于本地主机中,则您不需要它,例如,您可以使用127.0.0.1。如果它是服务器而您只是想知道它是否正在运行,那么只需尝试连接它即可。你并不需要这一切。

如果您指的是已连接的远程TCP IP:端口,您将查看错误的行或右侧的错误列。

如果您再说一些其他内容,请澄清。