Java-遍历IP地址列表并以IP地址为参数调用线程

Java-遍历IP地址列表并以IP地址为参数调用线程,java,multithreading,Java,Multithreading,我对Java比较陌生,我正在编写一个应用程序来查询ApacheHTTP服务器的access_log文件;这样,我想将IP地址分别提交(可能通过ApacheHttpClient库)到另一台服务器上的另一个Java实例(因为Web服务器没有启用FTP)以获取一些日志文件。目前,我已经设法通过修改一个“tail-f”等效类来满足程序的需要,然后操纵该数据来获得我需要处理的IP地址,我甚至设法使“tail”类线程化,以便它能够处理多个时间段 话虽如此,我想使用for循环来迭代我的computerRebo

我对Java比较陌生,我正在编写一个应用程序来查询ApacheHTTP服务器的
access_log
文件;这样,我想将IP地址分别提交(可能通过ApacheHttpClient库)到另一台服务器上的另一个Java实例(因为Web服务器没有启用FTP)以获取一些日志文件。目前,我已经设法通过修改一个“tail-f”等效类来满足程序的需要,然后操纵该数据来获得我需要处理的IP地址,我甚至设法使“tail”类线程化,以便它能够处理多个时间段

话虽如此,我想使用for循环来迭代我的
computerRebootList
String数组中的每个条目,并用每个地址创建一个线程来执行更多的工作,但我能想到的就是这个

for (String tmpIpAddress : computerRebootList ) {
            ComputerIpHandler handler = new ComputerIpHandler();
        }
然后创建另一个名为
ComputerIpHandler
的类,如下所示

public class KioskIpHandler implements Runnable {
    static final Logger logger = LogManager.getLogger( ComputerIpHandler.class );

    @Override public void run() {
        //do some code
    }

    public static void main(String computerIp) {
        Thread mainThread = new Thread(new ComputerIpHandler());
        mainThread.start();

        try {
            logger.info("log some stuff");
            mainThread.join();
            logger.info("yay it's done");
        }
        catch (InterruptedException errInterrupted) {
            logger.error(errInterrupted.getMessage());
            logger.error(errInterrupted.getStackTrace());
        }
    }
}
我在某个地方读到关于确保我需要管理资源限制,以便我必须创建最大数量的线程-可以说,我可以向这个类发送10个IP,然后让其余地址“队列”,直到一个返回。。。我只是没有足够的自信或流利,无法将这些想法概念化

编辑:我忽略了我仅限于Java 1.6,因为这是我们可以在此服务器上使用的JRE的最大兼容版本-不确定这是否会在某种程度上阻碍这项工作


有人能给我指出正确的方向吗?

检查java API中java.util.concurrent包中的ScheduledThreadPoolExecutor和ScheduledExecutorService类。这些类和包中的其他类将为您管理所有资源。从1.5版开始,它们就在java中可用。我建议使用java内置的FTP连接平台创建一个线程,用于在指定端口上连续接收数据,直到收到终止密钥为止

基本上,一个类将创建一个ServerSocket(服务器上的opensocket),在与另一个socket(客户端socket)连接时,它将创建一个用于接收信息的新线程

public class Server {
    public ServerSocket ss;
    public Socket clientSocket;
    public Thread receiveingThread;
    public BufferedReader inFromClient = null;
    public boolean running = false;

    public Server(int port) {
        try {
            ss = new ServerSocket(port);
            startReceiving();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public synchronized void startReceiving() {
        receiveingThread = new Thread("Recieve") {
            public void run() {
                String dataFromClient = new String("");
                while (running) {
                    try {
                        inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                        dataFromClient = inFromClient.readLine();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    if (dataFromClient.equals("TERMINATOR_KEY") {
                        stopRecieving();
                    }
                    else if(!dataFromClient.equals("")) {
                        //add item to array
                    }
                }
            }
        };
        receiveingThread.start();
    }

    public synchronized void stopReceiving() {
        try {
            running = false;
            receivingThread.join();
            ss.close();
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }

    public static void main(String[] args) {
        new Server(yourPortHere);
    }
}
然后,客户端类将类似于:

public class Client {
    public Socket socket;
    public Thread send;
    public Client(string serverPublicIP, int port) {
        try {
            socket = new Socket(serverPublicIP, port);
            send("some IP address");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void send(String toSend) {
        send = new Thread("Send") {
            public void run() {
                PrintWriter outToServer;
                try {
                    outToServer = new PrintWriter(new   OutputStreamWriter(socket.getOutputStream()));
                    outToServer.print(toSend);
                    outToServer.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                finally {
                    outToServer.close();
                }
            }   
        };
        send.start();
    }
    public static void main(String[] args) {
        new Client("127.0.0.1", yourPortHere);
    }
}
是oracle站点上socket教程开始部分的链接

是针对java.net.ServerSocket的Oracle文档


Oracle文档中是否有java.net.Socket

您检查过这个问题的答案了吗?本教程是学习如何使用线程池而不是单独的线程来更好地管理资源的良好开端。看看java及其朋友,你也可以在服务器上安装Java1.8(我假设你已经安装了),然后创建一个服务器类来使用java的FTP连接。在java.net包中,甚至有一个名为“ServerSocket”的类,它在指定的端口上创建套接字。假设您了解套接字和端口,您应该同意从长远来看这将更容易。@Fredulom这应该可以正常工作,java Socket类和ServerSocket类自java 1.0以来就已经存在了。如果您没有在Java中使用自定义FTP连接的经验,我可以链接一些教程,并在回答中给出一个简短的总结(如果您愿意)。谢谢@Michael,这看起来正是我想要的:)@Fredulom-您想获得一种内置功能,可以延迟安排任务或定期运行任务吗?如果是,则可能需要使用ScheduledThreadPoolExecutor。但如果您只是在寻找普通线程池,我建议您使用ExecutorService。@DROY,我要做的是遍历IP地址字符串的arraylist,并针对每个地址调用一个类,以使用IP地址作为参数执行一组命令。从我所读到的关于执行器的内容来看,我认为FixedThreadPool执行器是我所追求的,因为这允许我在必要时对作业进行排队。