当前位置: 首页 > 面试题库 >

用Java Ping多台服务器

慎兴业
2023-03-14
问题内容

我有一个程序可以向服务器发送ping请求。该列表很大,如果IP无法访问,则需要花费时间才能进入下一个列表IP

我希望对于每个IP,它都应创建一个新线程并同时处理所有这些线程。

这是代码:

for (int i = 0; i < 89; i++)
{
     ProcessBuilder processBuilder = new ProcessBuilder("ping", isWindows? "-n" : "-c", "1", buttons[i].getText());
     Process proc = processBuilder.start();
     returnVal = proc.waitFor();                       
}

如何使此代码对所有IPs 执行ping操作?


问题答案:

如果没有ProcessBuilder别人的建议,怎么办呢?

我有三个类-PingParallel是我的主类,PingTask是每个线程执行的任务,并且PingResult有结果代码(我们还可以添加一些其他信息,状态消息等)。

平平行

package com.test.thread;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class PingParallel {

    public static void main(String[] args) {
        int totalIps = 89;
        ExecutorService executor = Executors.newFixedThreadPool(totalIps);
        List<Future<PingResult>> list = new ArrayList<Future<PingResult>>();
        Callable<PingResult> callable = null;
        for(int i=0; i< totalIps; i++){
            callable = new PingTask("127.0.0"+i); // Get the ipAddres buttons[i].getText());
            Future<PingResult> future = executor.submit(callable);
            list.add(future);
        }
        for(Future<PingResult> fut : list){
            try {
                System.out.println(new Date()+ "::"+fut.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        executor.shutdown();
    }
}

PingTask

package com.test.thread;

import java.net.InetAddress;
import java.util.concurrent.Callable;

public class PingTask implements Callable<PingResult> {

  private String ipAddress;

  public PingTask(String ipAddress) {
    this.ipAddress = ipAddress;
  }

  @Override
  public PingResult call() {
    InetAddress inet = null;
    try {
      inet = InetAddress.getByName(ipAddress);
      int resultCode = inet.isReachable(5000) ? 0 : -1;
      return new PingResult(ipAddress, resultCode);
    } catch (Exception e) {
      e.printStackTrace();
      return new PingResult(ipAddress, -1);
    }
  }
}

PingResult

package com.test.thread;

public class PingResult {

  private String ipAddress;
  private int resultCode;

  public PingResult(String ipAddress, int resultCode) {
    this.ipAddress = ipAddress;
    this.resultCode = resultCode;
  }

  public String getIpAddress() {
    return ipAddress;
  }

  public int getResultCode() {
    return resultCode;
  }

  public String toString() {
    return "IpAddress :: "+ ipAddress + " Result Code : "+ resultCode;
  }
}


 类似资料:
  • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?

  • 我正在构建一个。NET核心web应用程序,在服务器端我为计划任务和长期运行任务添加了hangfire。在我添加的startup.cs文件中: 在configure函数中,我添加了以下内容: 是否有一种方法可以确保只有一个服务器在运行?或者,如果我可以在停止应用程序(IIS)时关闭服务器,并在运行应用程序时再次启动它

  • null null 谢谢你的回答。

  • 问题内容: 我正在将一些后端转换为模块,并在设置开发环境配置时感到困惑。我在Eclipse中使用Java,但未在Maven中使用Java。架构非常简单: 前端模块为默认模块。基本的GAE / GWT应用程序。将项目放入任务队列。 后端模块处理任务队列。 使用旧的后端体系结构,一个调试配置将启动开发服务器,该服务器将为GWT DevMode UI 和 后端任务处理提供服务。 问题的症结在于DevMo

  • 我想创建一个小应用程序,在后台记录数据。所以我试着用绑定服务。这很好,但如果我关闭应用程序,服务也会停止。< br >那么,我的问题是:使用即时服务来执行这一操作是不是一个好方法?当应用程序关闭时,我如何保持服务在后台运行(我也想在启动后启动它)?

  • 我尝试使用Java中的Sockets连接到多个客户端。一切似乎都正常,但问题是,服务器只监听第一个客户端。如果有多个客户端,服务器可以向它们发送所有消息,但他可以只监听来自第一个客户端的消息。我尝试了所有这些(我从昨天开始就遇到了这个问题)。所以我很确定,错误一定在“ClientListener”类中。 说明:有一个客户端列表(用于与字符串通信的连接)。在GUI中有一个列表,我可以在其中选择要与哪