Frage zu Swing,Threads, SwingWorker und Socket Communikation

blackson1c

Mitglied
Hallo

ich versuche mich gerade an einem Server Client Programm das über Sockets und ObjectInputStream und ObjectOutputStream kommuniziert.

Dabei hab ich das aktuelle Problem, das die Communikation im EDT mit abgearbeitet wird. Das führt dazu das einige Kommandos die GUI einfrieren lassen. Jetzt würde ich gern das von einander Trennen , und hier kommen die Probleme:

Ich habe versuch die Communikation in einen separaten Thread auszulagern :

Java:
private void ConnectButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        comm = new Comm();
        comm.start();
}

Java:
class Comm extends Thread
{
boolean status=true;
int count =0;
 Socket socket = null;

    private ObjectInputStream ois = null;
    private ObjectOutputStream oos = null;

    private CommandObject eingang = null;
    private CommandObject ausgang = null;




    @Override
public void run()
  {
        System.out.println("0");
      try {
        socket = new Socket("127.0.0.1", 44444);
        ois = new ObjectInputStream(socket.getInputStream());
        oos = new ObjectOutputStream(socket.getOutputStream());
        } catch(Exception e) {
          System.out.println(e.getMessage() );
         return;
        }
      System.out.println("1");

      ausgang = new CommandObject();
      ausgang.setCommand("Hallo Server");
        try {
            oos.writeObject(ausgang);
            oos.flush();
            oos.reset();
        } catch (IOException ex) {
            Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
        }

     System.out.println("2");

     while (status==true) {

         System.out.println(".");
         try {
                    eingang = (CommandObject) ois.readObject();


                    //Reaktion auf die Client Befehele
                    if (eingang.getCommand().equals("EXIT") == true) {

                        break;
                    }

                    if(eingang.getCommand().equals("WAIT") == true){
                        System.out.println("Please Wait - Server is Starting");
                    }
                  } catch (Exception e) {

                    break;
                }

            }
            try {
            ois.close();
            oos.close();
            socket.close();
            } catch (IOException ex) {
            System.err.println("Fehler beim Beenden der Verbindung");
            }
}

public void disconnect(){
         status=false;
         try {

            socket.close();
        } catch (IOException ex) {
            Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
        }
}
}

Der Code wird hier bei nur bis zur Zeile System.out.prinln("1") ausgeführt. Wobei dieses System.out nicht mehr ausgeführt wird.
Die GUI friert auch nicht ein, so das ich andere Threads mit anderen Buttons startet kann.

Hab das ganze auch mit SwingWorker versucht, mit dem selben ergebniss.
Was mach ich falsch ? bzw. Wie macht man sowas richtig, sodass ich aus der GUI immer noch Commandos an den Server schicken kann und dir server auch commandos an den Clienten schicken kann ?
 
Ist das nicht viel eher eine Socket-Frage ?
Java:
        ois = new ObjectInputStream(socket.getInputStream());

ObjectInputStream (Java Platform SE 6)
Creates an ObjectInputStream that reads from the specified InputStream. A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header.

Ist das dein Problem evtl.?
 
Java:
ausgang = new CommandObject();
      ausgang.setCommand("Hallo Server");
        try {
            oos.writeObject(ausgang);
            oos.flush();
            oos.reset();
        } catch (IOException ex) {
            Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
        }

Es kann ja nur hier irgendwo stoppen.

Java:
ausgang = new CommandObject();

Was passiert denn hier?
 
Aah, da hatte ich doch auch mal etwas ähnliches. Der Hinweis von eRaaaa stimmt schon. Hole dir erstmal nur den OutputStream vom Socket und den InputStream erst nach dem Schreiben (sprich wenn du die Antwort lesen willst).
 

Zurück
Oben