这是一个如何实现可能的解决方案的示例,在此示例中,程序使用一个队列来存储来自多个套接字写入器的值。
Queue<String> logValues = new LinkedList<>();
public synchronized void log(String value) {
logValues.add(value);
}
队列位于一个名为 BufferLogger 的类中,它实现了一个 Runnable 并等待 10 秒以获取队列的当前大小,具体取决于它继续使用从 0 迭代到队列大小并调用的 for 循环的大小队列中的 poll 方法,用于获取最新元素并将元素发送到日志文件,就像 FIFO 方法一样。
@Override
public void run() {
int timeToSave = 10000; //10 seconds
System.out.printf("Running Program Logger, log files every %d miliseconds. %s%n", timeToSave, new Date().toString());
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(timeToSave);
this.writeToFile();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void writeToFile() {
Date date = new Date();
File myLog = new File(String.format(filename));
FileWriter myLogWritter = null;
try {
myLogWritter = new FileWriter(myLog, true);
int queueSize = logValues.size();
myLogWritter.write(String.format("Sending data to log!. Current Log Queue Size: %d. Time:%s%n", queueSize, date.toString()));
System.out.printf("Sending data to log!. Current Log Queue Size: %d. Time:%s. Filename:%s%n", queueSize, date.toString(), myLog.getName());
for (int i = 0; i < queueSize; i++) {
myLogWritter.write(String.format("%s Logging Value: %s%n", date.toString(), logValues.poll()));
}
}
我正在分享完整的代码以获取更多信息,希望这会有所帮助:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class ProgramLogger {
static final int serverPort = 9999;
public static void main(String args[]) {
ServerSocket serverSocket = null;
BufferLogger bufferLogger = new BufferLogger();
new Thread(bufferLogger).start();
Socket socket = null;
try {
serverSocket = new ServerSocket(serverPort);
new ClientSender().start(); //client 1
new ClientSender().start(); //client 2
new ClientSender().start(); //client 3
new ClientSender().start(); //client 4
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
socket = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
new ServerReceptor(socket, bufferLogger).start();
}
}
}
class ClientSender extends Thread {
Socket socket;
PrintWriter out;
String serverAddress="localhost";
int serverPort=9999;
Random randomValue = new Random();
public void run() {
try {
System.out.println("Sarting Client Sender on Thread " + Thread.currentThread().toString());
socket = new Socket(serverAddress, serverPort);
out = out == null ? new PrintWriter(socket.getOutputStream(), true) : out;
while (!Thread.currentThread().isInterrupted()) {
out.println(Thread.currentThread().toString() + " - " + randomValue.nextInt(8000));
Thread.sleep(randomValue.nextInt(800));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class ServerReceptor extends Thread {
protected Socket socket;
private BufferLogger bufferLogger;
public ServerReceptor(Socket clientSocket, BufferLogger bufferLogger) {
this.socket = clientSocket;
this.bufferLogger = bufferLogger;
}
public void run() {
System.out.println("Sarting Server Receptor on Thread " + Thread.currentThread().toString());
InputStream inputStream = null;
BufferedReader bufferedReader = null;
DataOutputStream dataOutputStream = null;
try {
inputStream = socket.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
} catch (IOException e) {
return;
}
String line;
while (true) {
try {
line = bufferedReader.readLine();
if (line != null) {
bufferLogger.log(line);
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
class BufferLogger implements Runnable {
Queue<String> logValues = new LinkedList<>();
Date dateOfCreation = new Date();
String filename = String.format("myapplog%d.log", dateOfCreation.getTime());
public synchronized void log(String value) {
logValues.add(value);
}
public void writeToFile() {
Date date = new Date();
File myLog = new File(String.format(filename));
FileWriter myLogWritter = null;
try {
myLogWritter = new FileWriter(myLog, true);
int queueSize = logValues.size();
myLogWritter.write(String.format("Sending data to log!. Current Log Queue Size: %d. Time:%s%n", queueSize, date.toString()));
System.out.printf("Sending data to log!. Current Log Queue Size: %d. Time:%s. Filename:%s%n", queueSize, date.toString(), myLog.getName());
for (int i = 0; i < queueSize; i++) {
myLogWritter.write(String.format("%s Logging Value: %s%n", date.toString(), logValues.poll()));
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
myLogWritter.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@Override
public void run() {
int timeToSave = 10000; //10 seconds
System.out.printf("Running Program Logger, log files every %d miliseconds. %s%n", timeToSave, new Date().toString());
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(timeToSave);
this.writeToFile();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}