我对Java比较陌生,我正在编写一个应用程序来询问Apache HTTP服务器的access_log
文件;有了这个,我想单独提交IP地址(可能通过Apache HTTPClient库)到另一台服务器上的另一个Java实例(因为Web服务器没有启用FTP)来提取一些日志文件。目前,我已经成功地通过修改尾巴-f'等价的类,以满足程序的需要,然后操纵数据,以获得我需要做的事情的IP地址 - 我甚至成功地制作了' tail'类线程所以它可以解决多个时间段!
话虽如此,我想使用for循环遍历我的computerRebootList
字符串数组中的每个条目,并且每个地址创建一个线程来执行更多的工作,但我能想到的就是这个; < / p>
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的内容,然后使用其余的地址&#39;队列&#39;直到一个人回来......我只是不自信或不够流利,无法概念化这些想法。
编辑:我省略了我被限制在Java 1.6中,因为这是我们可以在这台服务器上使用的JRE的最大兼容版本 - 不确定这是否会阻碍这项工作...
有人能指出我正确的方向吗?
答案 0 :(得分:2)
检查java API中java.util.concurrent包中的ScheduledThreadPoolExecutor和ScheduledExecutorService类。该软件包中的那些和其他一些类将为您管理所有资源。从1.5版开始,它们在Java中可用
答案 1 :(得分:0)
我建议使用Java内置的FTP连接平台创建一个线程,以便在指定端口上持续接收数据,直到收到终止密钥。
基本上,一个类将创建一个ServerSocket(在服务器上打开套接字),并在与另一个套接字(客户端套接字)连接时,它将创建一个用于接收信息的新线程。
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);
}
}
This是oracle网站上套接字教程开始的链接。
This是java.net.ServerSocket的Oracle文档
This是java.net.Socket
的Oracle文档