6

我正在编写一个简单的程序,该程序从 MySQL 数据库中提取计算机名称,然后将这些名称存储到一个字符串数组列表中(这部分工作正常)。之后,我编写了一个类和一个将字符串作为参数(将是计算机名称)并尝试对其进行 ping 操作的方法。这是该类的代码:

public class Ping 
{
public void pingHost(String hostName)
{   
    try
    {
        InetAddress inet = InetAddress.getByName(hostName);
        boolean status = inet.isReachable(5000);
        if (status)
        {
            System.out.println(inet.getHostName() + " Host Reached\t" + inet.getHostAddress());
        }
        else
        {
            System.out.println(inet.getHostName() + " Host Unreachable");
        }

    }
    catch (UnknownHostException e)
    {
        System.err.println(e.getMessage() + " Can't Reach Host");
    }
    catch (IOException e)
    {
        System.err.println(e.getMessage() + " Error in reaching the Host");
    }
}

问题是,UnknownHostException即使我可以手动 ping 它们或者我将计算机名称硬编码为“hostName”,我仍然会被大多数计算机抛出。

这是我的主要外观:

public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException 
{
    ArrayList <String> list = new ArrayList<String>();  
    MySQLConnect myConnection = new MySQLConnect();
    myConnection.importData(list);
    Ping pingComputer = new Ping();
    pingComputer.pingHost(list.get(87));            
}

现在我只是想尝试一台正在抛出UnknownHostException但可以手动ping通的计算机。有人知道为什么会这样吗?

编辑...

只是为了多解释一点。例如在 main 中,如果我将这些参数传递给pingHost

pingComputer.pingHost("ROOM-1234");

它 ping 正常并返回正确的主机名/地址。但list.get(87)返回相同的主机名“ROOM-1234”但抛出UnknownHostException?这让我很困惑,不知道为什么它不起作用。

编辑

哇终于想通了。当我像“ROOM-1234”那样直接传递字符串时,ping 起作用的原因是因为没有空格并且从数组中获取,所以list.get(87)返回相同的东西但是当我检查时charLength,它返回了不同的值:) 所以我刚刚结束trim用于摆脱空白,现在它工作得很好。

pingComputer.pingHost(list.get(87).trim());

感谢所有的建议!

4

1 回答 1

-2

亲爱的,实际上您使用的代码是检查主机是否可访问。

使用以下类来 ping windows pc 使用 ping 方法,但对于 windows pc 以外的使用是可访问的。

package com.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Ping {

    public Boolean IsReachable(String ipaddress) {
        try {            
            final InetAddress host = InetAddress.getByName(ipaddress);

            try {
                return host.isReachable(3000);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return false;
    }

    public Boolean ping(String ipaddress) {
        Runtime runtime = Runtime.getRuntime();
        String cmds = "ping " + ipaddress;
        System.out.println(cmds);
        Process proc;

        try {
            proc = runtime.exec(cmds);
            proc.getOutputStream().close();
            InputStream inputstream = proc.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
            String line;

            while ((line = bufferedreader.readLine()) != null) {
                if (line.contains("Reply from " + ipaddress + ":")) {
                    return true;
                }
            }
        } catch (IOException e) {

            e.printStackTrace();
        }
        return false;
    }
}

并使用如下代码

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    MySQLConnect myConnection = new MySQLConnect();
    myConnection.importData(list);
    Ping ping = new Ping();

    if (ping.ping(list.get(87)) {
        System.out.prinln("Online / Host is reachable");
    } else {
        System.out.prinln("Offline /Host is unreachable");
    }
}

但我建议通过 ip 地址 ping 比用计算机名 ping 更好。

于 2014-04-06T18:21:33.420 回答