Hallo,
ich habe folgenden Code als Server in Verwendung:
Der Client sendet einen Termin an den Server und der Server fügt diesen der ArrayList test hinzu. Später bekommt der Server vom gleichen Client die Anfrage "getTermine". Das passiert in der letzten If Anweisung. Dort übergebe ich meinem Protokoll einfach die ArrayList test. Jetzt mein Problem, die ArrayList ist dort leer, obwohl ich ja vorher einen Termin hinzugefügt habe. Ich vermute das hat irgendwas mit dem Threading zu tun, aber ich komme nicht auf den Fehler. Wäre nett, wenn mir da mal jemand einen Tipp geben könnte.
mfg Jojo
ich habe folgenden Code als Server in Verwendung:
Java:
package server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import protocol.TProtocol;
import model.Termin;
public class Server {
private ServerSocket server;
private Termin termin;
private ArrayList<Socket> clients = new ArrayList<Socket>();
private TerminDatabase tbase = new TerminDatabase();
private List<Termin> test = Collections.synchronizedList(new ArrayList<Termin>());
public Server(int port) throws Exception {
server = new ServerSocket(port);
System.out.println("Server gestartet, warte auf Verbindung auf Port " + port);
while(true) {
final Socket client = server.accept();
System.out.println("Client akzeptiert! " + client.getInetAddress());
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
handleRequest(client, ois, oos);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
thread.start();
}
}
private void handleRequest(Socket client, ObjectInputStream ois, ObjectOutputStream oos) {
while(!client.isClosed()) {
TProtocol prot = null;
try {
prot = (TProtocol) ois.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
try {
client.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("Client " + client.getInetAddress() + " closed the connection");
break;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handleCommand(prot, ois, oos);
}
}
private void handleCommand(TProtocol prot, ObjectInputStream ois, ObjectOutputStream oos) {
if(prot.getCommand().equals("add")){
//tbase.addTermin(prot.getNtermin());
synchronized(test){
test.add(prot.getNtermin());
}
}
if(prot.getCommand().equals("delete")){
Termin termin = prot.getNtermin();
System.out.println("Beschreibung lautet delete: " + termin.getBeschreibung());
}
if(prot.getCommand().equals("getTermine")){
synchronized(test){
TProtocol tp = new TProtocol();
tp.setCommand("setTermine");
//tp.setNtermine(tbase.getTermine());
tp.setNtermine(test);
System.out.println("print");
// for(Termin t : test){
// System.out.println(t.getName());
// }
try {
oos.writeObject(tp);
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Der Client sendet einen Termin an den Server und der Server fügt diesen der ArrayList test hinzu. Später bekommt der Server vom gleichen Client die Anfrage "getTermine". Das passiert in der letzten If Anweisung. Dort übergebe ich meinem Protokoll einfach die ArrayList test. Jetzt mein Problem, die ArrayList ist dort leer, obwohl ich ja vorher einen Termin hinzugefügt habe. Ich vermute das hat irgendwas mit dem Threading zu tun, aber ich komme nicht auf den Fehler. Wäre nett, wenn mir da mal jemand einen Tipp geben könnte.
mfg Jojo