Ich habe jetzt erstmal mit nem kleinen chat client-server angefangen. der client ist so weit fertig mangels server noch nicht getestet.
Beim Server habe ich nun ein konzeptionelles Problem. Ich habe bis jetzt folgendes:
Code:
package ChatServer;
import java.io.*;
import java.net.*;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
ServerSocket serversocket;
Date start = new Date();
boolean ok_server = true;
Server(int port) {
try {
serversocket = new ServerSocket(port);
}
catch(IOException e) { System.out.println(e); }
System.out.println("Server auf Port " + port + " erstellt.");
}
public static void main(String [] args) {
Server server = (args.length == 0) ? new Server(1337) : new Server(Integer.parseInt(args[0]));
server.startServing();
}
void startServing() {
ExecutorService executor = Executors.newCachedThreadPool();
try {
while(ok_server == true) {
executor.execute(new Connection(serversocket.accept()));
}
}
catch(IOException e) { System.out.println(e); }
}
class Connection implements Runnable {
Socket connect;
BufferedReader in;
BufferedWriter out;
Connection(Socket sock) {
try {
connect = sock;
in = new BufferedReader(new InputStreamReader(connect.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(connect.getOutputStream()));
}
catch(IOException e) { System.out.println(e); }
}
@Override public void run() {
Output output = new Output(out);
Input input = new Input(in);
Thread inThread = new Thread(input);
Thread outThread = new Thread(output);
inThread.start();
outThread.start();
}
class Input implements Runnable {
BufferedReader in;
Input(BufferedReader in) {
this.in = in;
}
@Override public void run() {
}
}
class Output implements Runnable {
BufferedWriter out;
Output(BufferedWriter out) {
this.out = out;
}
@Override public void run() {
}
}
}
}
Für jede angenommene Exception wird ein Thread erstellt, der wiederum 2 weitere Threads erstellt, jeweils für in und output. so weit so problemfrei. Nun Frage ich ich jedoch, wie ich das folgende problem lösen soll:
die nachrichten sollen als strings gespeichert werden, vorerst nur mit zeit und nahricht, später mit nickname dazwischen.
Die Strings sollen vorerst in einen buffer geschrieben werden, in den jede nachricht, die noch nicht von jedem aktuellen client versendet wurde gespeichert wurde. wird eine nachricht aktuell nichtmehr benötigt, soll diese in eine datei geschrieben werden.
lesend soll jeder output thread einen zeiger haben, der auf die erste noch nicht versendete zeile im buffer zeigt.
so oder so ähnlich stelle ich mir das vor, bin natürlich für verbesserungsvorschläge offen.
irgendjemand eine idee wie das zu implementieren wäre?