Hallo Ihr,
ich habe gerade ein Programm geschrieben, indem es um Server-Client-Kommunikation geht.
Es soll möglich sein über einen Objekt-Stream Objekte von Server nach Client und umgekehrt zu verschicken.
Dazu habe ich mich der Thread-Programmierung bedient.
In der Main Methode erzeuge ich zwei (natürlich threadsichere) Queues, die an einen Thread weitergegeben werden. In diesem wird einmal der ServerListener (ClientListener auf der anderen Seite) und ServerSender (ClientSender) erzeugt, an die auch wieder die Queues weitergegeben werden.
Senden soll dann einfach so funktionieren, dass ein Objekt der Klasse Message (meine Klasse) in eine Queue gesteckt wird, aus der aus dem richtigen Thread eingelesen und über den ObjectStream geschickt wird.
Und ja das geht irgendwie nicht.
Also habe ich erstmal geguckt, ob die Threads überhaupt erzeugt werden.
Dafür habe ich einfach jeweils in den Listenern, als auch in den Sendern eine Ausgabe mit "Hallo ich bin der ServerListener (usw.)" gemacht. Nichts davon wird mir ausgegeben.
Und jetzt kommt das richtig merkwürdige: wenn ich das Serverprogramm auf einem richtigen Server per Terminal aufrufe, kann ich sogar Verbindung dazu aufbauen. Und das obwohl die Threads nicht funktionieren ?!
Hier mal beispielhaft der Code des Servers. Der des Clients ist analog:
Stellt gerne Fragen, wenn ich das nicht korrekt dokumentiert habe. Ich werde den ganzen Tag vor dem PC campen und versuchen dieses Problem zu lösen.
Grüße
BigFish
ich habe gerade ein Programm geschrieben, indem es um Server-Client-Kommunikation geht.
Es soll möglich sein über einen Objekt-Stream Objekte von Server nach Client und umgekehrt zu verschicken.
Dazu habe ich mich der Thread-Programmierung bedient.
In der Main Methode erzeuge ich zwei (natürlich threadsichere) Queues, die an einen Thread weitergegeben werden. In diesem wird einmal der ServerListener (ClientListener auf der anderen Seite) und ServerSender (ClientSender) erzeugt, an die auch wieder die Queues weitergegeben werden.
Senden soll dann einfach so funktionieren, dass ein Objekt der Klasse Message (meine Klasse) in eine Queue gesteckt wird, aus der aus dem richtigen Thread eingelesen und über den ObjectStream geschickt wird.
Und ja das geht irgendwie nicht.
Also habe ich erstmal geguckt, ob die Threads überhaupt erzeugt werden.
Dafür habe ich einfach jeweils in den Listenern, als auch in den Sendern eine Ausgabe mit "Hallo ich bin der ServerListener (usw.)" gemacht. Nichts davon wird mir ausgegeben.
Und jetzt kommt das richtig merkwürdige: wenn ich das Serverprogramm auf einem richtigen Server per Terminal aufrufe, kann ich sogar Verbindung dazu aufbauen. Und das obwohl die Threads nicht funktionieren ?!
Hier mal beispielhaft der Code des Servers. Der des Clients ist analog:
Java:
class Spielserver {
public static void main(String[] args) throws Exception {
Queue<Message> sendq = new ConcurrentLinkedQueue<Message>();
Queue<Message> listenq = new ConcurrentLinkedQueue<Message>();
Thread t = new Thread(new Server(6001, sendq, listenq));
t.start();
Message msg = new Message("Huhu");
sendq.add(msg);
System.out.println("laeuft");
}
}
Java:
public class Server implements Runnable{
private int port;
public Queue<Message> sendq = new ConcurrentLinkedQueue<Message>();
public Queue<Message> listenq = new ConcurrentLinkedQueue<Message>();
public Server(int port, Queue<Message> sendq, Queue<Message> listenq){
this.port=port;
this.sendq = sendq;
this.listenq = listenq;
}
public void run(){
verbinde();
}
public void verbinde(){
ServerSocket server = null;
try {
server = new ServerSocket(port);
} catch (IOException ioe) {
System.err.println("Der Port " + port + " kann nicht benutzt werden!");
System.exit(1);
}
Socket client = null;
while(true) {
try {
client = server.accept();
} catch (IOException ioe) {
System.err.println("Accept failed.");
System.err.println(ioe);
System.exit(1);
}
try{
// Starte einen neuen Thread auf dem dem Klienten zugehoert wird
System.out.println("Threads werden erzeugt: Serverebene");
Thread listener = new Thread(new ClientListener(client, listenq));
listener.start();
Thread sender = new Thread(new ClientSender(client, sendq));
sender.start();
} catch(IOException ioe) {
System.out.println("Fehler bei Thread-Erstellung");
System.exit(1);
}
}
}
}
Java:
class ClientListener implements Runnable { //DER HOERT DEM KLIENTEN ZU!
private ObjectInputStream in = null;
private Object msg=null;
public Queue<Message> listenq = new ConcurrentLinkedQueue<Message>();
public ClientListener(Socket client, Queue<Message> listenq) throws IOException {
in = new ObjectInputStream(client.getInputStream()); //Hiermit wird empfangen
this.listenq = listenq;
}
public void run() {
try {
System.out.println("Ich bin der ClientListener!");
while (true) {
try{
msg = in.readObject();
if(msg instanceof Message) {
Message Nachricht = new Message(msg);
listenq.add(Nachricht);
}
else System.out.println("Keine gueltige Message");
} catch(ClassNotFoundException cnfe) {}
}
} catch (IOException e) {
System.err.println(e);
}
}
}
Java:
public class ClientSender implements Runnable{ //DER SENDET MESSAGES AN CLIENT
private ObjectOutputStream oos = null;
public Queue<Message> sendq = new ConcurrentLinkedQueue<Message>();
public ClientSender(Socket client, Queue<Message> sendq) throws IOException{
oos=new ObjectOutputStream(client.getOutputStream()); //Hiermit wird gesendet
this.sendq = sendq;
}
public void run(){
System.out.println("Ich bin der ClientSender!");
while(true){
if(!sendq.isEmpty())
try{
oos.writeObject(sendq.remove());
} catch(IOException ioe) { }
}
}
}
Stellt gerne Fragen, wenn ich das nicht korrekt dokumentiert habe. Ich werde den ganzen Tag vor dem PC campen und versuchen dieses Problem zu lösen.
Grüße
BigFish
Zuletzt bearbeitet von einem Moderator: