# StringArray in .txt Datei --> langsam wegen Client/Server!?



## sambosoul (22. Apr 2009)

Servus,

ich hab ein StringArray, das ich auf dem Client mit insgesamt 18 Strings fülle, welche ich mit getText() aus JTextFields hole.
Die Daten werden werden über einen ObjectOutputStream an den Server geschickt, der seinerseits mit einem ObjectInputStream die Daten annimmt und diese in eine .txt Datei (ebenfalls auf dem Server) abspeichert.
Das klappt auch alles hervorragend, nur leider werden die Buchstaben immer einzeln in die Datei geschrieben, Buchstabe für Buchstabe. Das ist nervend und nicht Sinn der Sache. Was kann ich dagegen tun!? 

Hier mein Coding:

Client:

```
public void removeUpdate(DocumentEvent arg0) {



                    try {

                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    out.writeObject(array);

                    }
                catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }
```

Server:

```
public void saveTimer(){

            Timer t = new Timer("Timer-Thread", true);
            // Erstelle den Timer-Task als innere Klasse
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                try {
                ObjectInputStream ips = new ObjectInputStream(Server.s.getInputStream());
                BufferedWriter bw = new BufferedWriter(new FileWriter(file));

                String[] array = new String[18];
                array = (String[])ips.readObject();
                for(String i : array){
                    bw.flush();
                    bw.write(i + "\n");
                    bw.flush();
                }
                bw.close();

                for(String o : array){
                    System.out.println(o);
                }




                   }
                catch (ClassNotFoundException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }                    catch(IOException e){}
                }

            };
           t.schedule(task,0,3000);
        }
```

Vielen Dank für eure Tipps und Anregungen


----------



## madboy (22. Apr 2009)

Du führst zwei Mal bw.flush() aus. Flush bewirkt, dass der Puffer von BufferedWriter geleert wird, also alles auf die Festplatte geschrieben wird. 
Lass das flush() weg und alles wird gut bzw. erst gepuffert und dann in einem Rutsch auf die Platte geschrieben.


----------



## sambosoul (22. Apr 2009)

Hallo madboy, vielen Dank für deine sehr schnelle Antwort, top! 
Habe das erste flush() vor dem Schreibvorgang entfernt, klappt jetzt besser. Allerdings habe ich noch ein Problem, an dem ich nunmehr sehr lange sitze und einfach keine Lösung finde:

Folgende Situation:

Es gibt mehrere Textfelder, in die der Benutzer auf dem Client Werte eingeben kann. Ziel soll es sein, das sobald der Benutzer Werte eingibt, die Daten auf den Server übertragen werden und in einem festen Intervall in eine .txt Datei geschrieben werden.
Ich habe das auf dem Client mit einem DocumentListener realisiert, der die Methoden insertUpdate(), removeUpdate() und changeUpdate() inplementiert. In jeder dieser Methoden werden die Inhalte der Textfelder mit getText() in ein Array übergeben, und auf den Server übertragen.


```
public void insertUpdate(DocumentEvent arg0) {
                try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    out.writeObject(array);

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


            public void removeUpdate(DocumentEvent arg0) {



                    try {

                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    out.writeObject(array);

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



                }

            public void changedUpdate(DocumentEvent arg0) {

                try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    out.writeObject(array);

                }
                catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }
                }
```

Soweit so gut! 
Der Server empfängt die Daten und schreibt die Strings, durch einen Timer, in eine .txt Datei. 


```
public void saveTimer(){
              
            Timer t = new Timer("Timer-Thread", true);
            // Erstelle den Timer-Task als innere Klasse
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                try {
                ObjectInputStream ips = new ObjectInputStream(new BufferedInputStream(Server.s.getInputStream()));
                BufferedWriter bw = new BufferedWriter(new FileWriter(file));

                String[] array = new String[18];
                array = (String[])ips.readObject();
                for(String i : array){
                    bw.flush();
                    bw.write(i + "\n");
                    
                }
//                bw.close();

                for(String o : array){
                    System.out.println(o);
                }




                   }
                catch (ClassNotFoundException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }                    catch(IOException e){}
                }

            };
           t.schedule(task,0,3000);
        }
```

So, jetzt kommt allerdings mein Problem:

Der Server muss ja ebenfalls wissen, das er bei einer Veränderung der Textfelder die Methode saveTimer() aufrufen muss, daher habe ich das folgendermaßen gelöst:


```
class Listener implements DocumentListener{

    Server s = new Server();
    public void insertUpdate(DocumentEvent arg0) {
        
        s.saveTimer();
    }

    public void removeUpdate(DocumentEvent arg0) {
        s.saveTimer();
    }

    public void changedUpdate(DocumentEvent arg0) {
        s.saveTimer();
    }
    
}
```

Aber wenn ich das so alles realisiere, bekomme ich immer eine Exception, mit der ich nichts anfangen kann 
22.04.2009 21:59:41 main.Listener insertUpdate
SCHWERWIEGEND: null
java.net.SocketException: Socket is closed
        at java.net.Socket.getOutputStream(Socket.java:803)
        at main.Listener.insertUpdate(Listener.java:53)
..
...
....
....

Zusammenfassend: Der Client muss auf Änderungen in den Textfeldern lauschen, damit er bei jedem Tastendruck die neuesten Daten der Textfelder an den Server schickt. 
Der Server muss seinerseits ebenfalls bei einem Tastendruck die Daten alle 5 sek. wegschreiben, und zwar immer die neuesten, aktuellen Daten.

Ich weiss, es ist sehr viel Coding, und viel Text auf einmal. Aber ich verzweifel, ich hänge seit Tagen an diesem Problem und weiss nicht wen ich sonst fragen kann


----------



## Schandro (22. Apr 2009)

Ich verstehe deinen Post nicht. Welcher code gehört zum Server, welcher zum Client? Bis jetzt sieht es so aus, als ob der DocumentListener mit dem unpassenden namen "Listener" in dem Server-Teil steht, oder?

Da fehlt Code !?..

Außerdem sagt die Fehlermeldung doch bereits, das der Socket schon geschlossen wurde und du deswegen nichts mehr mit ihm senden kannst. Entweder du schließt den Socket nicht oder du müsstest nen neuen erstellen.

PS: Was meinst du mit 5 Sekunden, die Daten sollen doch bei jeder Textfeldänderung aktualisiert werden.


----------



## sambosoul (22. Apr 2009)

Der erste Codeausschnitt gehört zum Client, der den Inhalt der Textfelder bei jeder textfeldaktion an den Server schickt. Der zweite Codeausschnitt gehört zu dem Server, der die empfangenen Werte in eine .txt Datei schreibt.
Der letzte Codeausschnitt ist ein Documentlistener auf dem Server, der die Methode saveTimer() startet, da der server ja auch wegschreiben soll, sobald eine Änderung in den Textfelder gemacht wird.

Kurz gesagt --> Client gibt Daten in textfeld ein --> Client schickt Daten an Server UND Server schreibt gleichzeitig die aktuellen vom Client eingegebene Daten in eine .txt Datei.

Warum ist der Name "Listener" unpassend? Der Name beschreibt die logische Funktion des Codings ganz gut find ich :-D

Mit den 5 sekunden meine ich, das der Server, sobald nur irgendeine Änderung in den Textfeldern geschieht, in einer Endlosschleife alle 5 sek. selbstständig nachschaut, ob die Textfelder aktualisierte Daten beinhalten, also:

Client gibt was ein--> nach 5 sek. wegschreiben in Datei --> Client gibt erneut was ein --> Client schreibt nach 5 sek. erneut die neuen Daten weg!

Das mit den Socket is closed verstehe ich aber nicht. 
Aber du hast Recht, ich habe vermutlich einen kleinen Codeteil vergessen, der für die Problemlösung wichtig wäre:


```
public class Listener implements DocumentListener{



    String[] array = new String[18];
    
    PrintWriter pw = null;
    BufferedWriter bw = null;

    public void Registration(){
        try{
        pw = new PrintWriter(Main.skt.getOutputStream());
        bw = new BufferedWriter(pw);
        bw.write(Register.usernameRegister.getText() + "\n");
        bw.write(Register.passwordRegister.getText());
        }
        catch(Exception e){}
        finally{
            try {
                bw.flush();
                bw.close();
            } catch (IOException ex) {
                Logger.getLogger(Listener.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }


    public void insertUpdate(DocumentEvent arg0) {
                try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    out.writeObject(array);

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


            public void removeUpdate(DocumentEvent arg0) {



                    try {

                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    out.writeObject(array);

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



                }

            public void changedUpdate(DocumentEvent arg0) {

                try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    array[2] = Client.pricefield_art1.getText();
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    array[5] = Client.pricefield_art2.getText();
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    array[8] = Client.pricefield_art3.getText();
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                    
                    out.writeObject(array);

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



 }
```

Die Methode Registration entnimmt ebenfalls zwei Textfelder für die Benutzerregistrierung, soll allerdings unabhängig von den anderen Streams behandelt werden.
Wie kann ich denn mehrere Client/Server Verbindungen aufbauen!? Das Programm ist generell Multi Threaded Client/Server ausgelegt, d.h. mehrere Clients können sich zu dem Server verbinden.
Aber ich möchte einfach mehrere Output/InputStreams verwenden, wie realisiere ich das? :-(


----------



## Schandro (22. Apr 2009)

nur zur Klarstellung:
Du hast einen DocumentListener im Programm Server, der auf Änderungen im Programm Client reagieren soll. Hast du den irgendwie per RMI beim Client registriert oder wie soll das funktionieren?


----------



## sambosoul (22. Apr 2009)

Schandro hat gesagt.:


> nur zur Klarstellung:
> Du hast einen DocumentListener im Programm Server, der auf Änderungen im Programm Client reagieren soll. Hast du den irgendwie per RMI beim Client registriert oder wie soll das funktionieren?



Nicht direkt. 
Der DocumentListener im Server führt bei einer Textänderung jeweils die saveTimer() Methode aus, um die Daten wegzuschreiben.
Der DocumentListener im Client muss meiner Meinung nach ebenfalls vorhanden sein, damit er bei einer Textänderung die Daten überhaupt erst an den Client überträgt.
RMI ist mir ein Begriff, soll aber laut unserem Prof nicht verwendet werden. Würde es mit meiner Idee nicht funktionieren?


----------



## Schandro (23. Apr 2009)

> Der DocumentListener im Server führt bei einer Textänderung jeweils die saveTimer() Methode aus, um die Daten wegzuschreiben.
> Der DocumentListener im Client muss meiner Meinung nach ebenfalls vorhanden sein, damit er bei einer Textänderung die Daten überhaupt erst an den Client überträgt.


Das rote sollte Server heissen, oder?

Der DocumentListener muss nur im Client vorhanden sein. DocumentListener sind dazu da, um sie an GUI Componenten zu kleben, nicht um den Stream Input einer Client/Server Beziehung auszuwerten oder wie auch immer du dir das vorgestellt hast^^

Das Problem ist, das nur wenn du saveTimer() aufrufst, der Stream Input vom Client angenommen wird. Woher soll der Server aber wissen, das er saveTimer() aufrufen soll, wenn er garnicht weiß ob der Client gerade was schickt oder nicht?

Ich glaube, du solltest die ganze Art wie die Streams genutzt werden nochmal überdenken und einen Ort benutzen, wo IMMER der input von jeweils einem Client angenommen wird und je nachdem was das für ein Input ist an entsprechende Methoden weitergeleitet wird.

Beim überdenken wirst du auch drauf kommen, wie du mehrere Clients im Server behandeln kannst..


----------



## sambosoul (23. Apr 2009)

Richtig, das rote sollte Server heissen ;-)
Ja, dann muss ich mal schauen wie ich das umsetze, aber prinzipiell kann ich mein Vorhaben schon mit normalen Streams lösen, oder?


----------



## Schandro (23. Apr 2009)

Klar, nur um ein paar Daten zu übertragen brauch man kein spezielles Framework benutzen.


----------



## sambosoul (23. Apr 2009)

Hallo schandro,

habe deinen Rat mit den Streams angenommen und die halbe Nacht den Aufbau im Coding angepasst, und mir den gesamten Vorgang mal zeichnerisch auf Blatt Papier dargestellt und jetzt funktioniert es (fast).

Das Wegschreiben der Daten in die .txt Datei, welche vom Client angetriggert werden, klappt einwandfrei. Es wird in festen Intervallen von 3 sek. in die .txt Datei geschrieben, allerdings wird von einem Textfeld (bzw. einem Arrayelement) immer nur die ersten 1-2 Buchstaben weggeschrieben. Der Rest des Textfeldes wird erst bei einer nächsten Triggeraktion des Benutzers weggeschrieben.

Also:

User gibt etwas in Textfeld Nr.1 ein (z.B. "Sonne") --> Server schreibt "So" weg ---> User schreibt etwas in Textfeld Nr.2 (z.B "Regen") --> Server schreibt "nne" (also Sonne) und "Re" weg... etc.

Das jeweilige Arrayelement wird nie komplett weggeschrieben.

Hier mein Coding... habe den Timer herausgenommen und stattdessen einen normalen Thread.sleep() genommen, erscheint mir einfacher.


```
static class saveTimer extends Thread{

                public void run() {
                while(true){
                try {
                 
                ObjectInputStream ips = new ObjectInputStream(new BufferedInputStream(Server.s.getInputStream()));
                BufferedWriter bw = new BufferedWriter(new FileWriter(file));

                String[] array = new String[18];
                array = (String[])ips.readObject();
                sleep(3000);
                for(String i : array){
                bw.flush();
                bw.write(i + "\n");
}
```

Die catch Konstrukte wurden bewusst weggelassen, das es übersichtlicher ist 
Habe den sleep() Befehl testweise an verschiedenen Stellen eingesetzt, allerdings ohne Erfolg. Wie kann ich es erreichen das das jeweilige Array komplett weggeschrieben wird?

Danke und Gruß
SamboSoul


----------



## Ebenius (23. Apr 2009)

Ich hab jetzt nicht das ganze Thema durchgelesen. Aber das Problem liegt doch am Zeitpunkt des Versendens, oder? Ein Document feuert doch an alle DocumentListener bei jedem _inset_. Jeder einzelne Tastenanschlag feuert also einen Event. Das willst Du doch so nicht, oder?

Ebenius


----------



## sambosoul (23. Apr 2009)

Hallo,

richtig, es soll NICHT bei jedem Tastenanschlag geschrieben werden.
Der User gibt etwas ein z.B. "Sonne", der Server startet den Timer und schreibt nach xx sek. den Inhalt in eine .txt Datei. Es soll praktisch alle xx sek. nachgeschaut werden, ob es eine Änderung in den Textfeldern gibt.


----------



## Schandro (23. Apr 2009)

Du könntest einen Thread bzw. javax.swing.Timer laufen der immer wieder den aktuellen Text mit dem zu letzt gesendeten vergleicht, das ist aber unschön weil es dann trotzdem manchmal während des Tippens gesendet wird..
Du könntest z.b. immer dann ein Textfeld kontrollieren, wenn der Benutzer eine andere Component fokusiert hat (FocusListener -> focusLost)
Oder du baust nen "Hochladen"-Button ein, so das der Benuzer selber die Kontrolle hat was mit den Daten passiert. (die meisten Benutzer haben gern die Kontrolle über ihr Programm^^)


----------



## Ebenius (23. Apr 2009)

Zusätzlich oder alternativ zum Hochladen-Button: ActionListener an das JTextField hängen und aus dem heraus senden. Dann wird bei ENTER gesendet.

Ebenius


----------



## sambosoul (24. Apr 2009)

Hallo,

danke für eure zahlreichen Vorschläge. Ein "Hochlade"-Button fällt leider raus, da die gesamte Prozedur ohne Benutzeraktion geschehen soll, also ein Druck auf einen Button ist verboten :-(
Werde mir aber die anderen Vorschläge genauer anschauen.

Ich habe so langsam das Problem, das ich in meinem eigenen Programm nicht mehr durchblicke, ich habe das Gefühl nach 1 1/2 Jahren Java nun an meinen Programmiergrenzen angekommen zu sein, und egal wieviele Stunden ich jeden Tag investiere ich mache keine Fortschritte, und andere Arbeit bleibt liegen.
Aber genug geheult, ich habe inzwischen einen Bereich ausgemacht, in dem ich definitiv Wissenslücken habe, und zwar Streams bzw. Sockets.
Streams und Sockets sind generell kein Problem, wenn es nur eine Verbindung ist. Aber ich habe in meinem Programm 2 Methoden,die Daten an den Server senden müssen, und ich bekomme es nicht, das Methode Nr.1 die Daten in Datei Nr.1 speichert und Methode Nr.2 die Daten in Datei Nr.2! Es geht immer nur eine der beiden Methoden, nie beide zusammen, weil ich IMMER eine "Socket is closed" Exception bekomme.
Das Problem ist das ich trotz Literatur (Java ist eine Insel etc.) die Funktionsweise der Streams/Sockets bei MEHREREN Verbindungen.

Damit ihr seht wo genau meine Unsicherheit ist, hier ein Codingteil des Clients:


```
public class Asynchronous extends Thread implements DocumentListener{

    
    public void Registration(){
        try {
            ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
            String[] array_reg = new String[2];
            array_reg[0] = Register.usernameRegister.getText();
            array_reg[1] = Register.passwordRegister.getText();
            out.flush();
            out.writeObject(array_reg);
//            out.close();

        } catch (IOException ex) {
            Logger.getLogger(Asynchronous.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
        
        
        
    
    
    String[] array = new String[23];
   
    public void insertUpdate(DocumentEvent arg0) {
                    try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    double erg_art1 = Double.parseDouble(Client.amount_art1.getText())*Client.price_art1;
                    Client.pricefield_art1.setText(Double.toString(erg_art1));
                    array[2] = Double.toString(erg_art1)+ "€";
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    double erg_art2 = Double.parseDouble(Client.amount_art2.getText())*Client.price_art2;
                    Client.pricefield_art2.setText(Double.toString(erg_art2));
                    array[5] = Double.toString(erg_art2)+ "€";
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    double erg_art3 = Double.parseDouble(Client.amount_art3.getText())*Client.price_art3;
                    Client.pricefield_art3.setText(Double.toString(erg_art3));
                    array[8] = Double.toString(erg_art3)+ "€";
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                if(Client.rb1.isSelected()){
                        array[18] = Client.rb1_price;
                    }
                    if(Client.rb2.isSelected()){
                        array[19] = Client.rb2_price;
                    }
                    if(Client.rb3.isSelected()){
                        array[20] = Client.rb3_price;
                    }
                    out.flush();
                    out.writeObject(array);
                    //Änderung 23:25 Uhr
//                    out.close();
                    
                    }
                    catch(NumberFormatException e){}
                catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }

                    }

//            }
            public void removeUpdate(DocumentEvent arg0) {
                    try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    double erg_art1 = Double.parseDouble(Client.amount_art1.getText())*Client.price_art1;
                    Client.pricefield_art1.setText(Double.toString(erg_art1));
                    array[2] = Double.toString(erg_art1)+ "€";
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    double erg_art2 = Double.parseDouble(Client.amount_art2.getText())*Client.price_art2;
                    Client.pricefield_art2.setText(Double.toString(erg_art2));
                    array[5] = Double.toString(erg_art2)+ "€";
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    double erg_art3 = Double.parseDouble(Client.amount_art3.getText())*Client.price_art3;
                    Client.pricefield_art3.setText(Double.toString(erg_art3));
                    array[8] = Double.toString(erg_art3)+ "€";
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                if(Client.rb1.isSelected()){
                        array[18] = Client.rb1_price;
                    }
                    if(Client.rb2.isSelected()){
                        array[19] = Client.rb2_price;
                    }
                    if(Client.rb3.isSelected()){
                        array[20] = Client.rb3_price;
                    }
                    out.flush();
                    out.writeObject(array);
                    //Änderung 23:25 Uhr
//                    out.close();

                    }
                    catch(NumberFormatException e){}
                catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }

                    }

            public void changedUpdate(DocumentEvent arg0)  {
                    try {
                    ObjectOutputStream out = new ObjectOutputStream(Main.skt.getOutputStream());
                    array[0] = Client.amount_art1.getText();
                    array[1] = Client.size_art1.getSelectedItem().toString();
                    double erg_art1 = Double.parseDouble(Client.amount_art1.getText())*Client.price_art1;
                    Client.pricefield_art1.setText(Double.toString(erg_art1));
                    array[2] = Double.toString(erg_art1)+ "€";
                    array[3] = Client.amount_art2.getText();
                    array[4] = Client.size_art2.getSelectedItem().toString();
                    double erg_art2 = Double.parseDouble(Client.amount_art2.getText())*Client.price_art2;
                    Client.pricefield_art2.setText(Double.toString(erg_art2));
                    array[5] = Double.toString(erg_art2)+ "€";
                    array[6] = Client.amount_art3.getText();
                    array[7] = Client.size_art3.getSelectedItem().toString();
                    double erg_art3 = Double.parseDouble(Client.amount_art3.getText())*Client.price_art3;
                    Client.pricefield_art3.setText(Double.toString(erg_art3));
                    array[8] = Double.toString(erg_art3)+ "€";
                    array[9] = Client.customerText_salutation.getText();
                    array[10] = Client.customerText_firstname.getText();
                    array[11] = Client.customerText_surname.getText();
                    array[12] = Client.customerText_street.getText();
                    array[13] = Client.customerText_plz.getText();
                    array[14] = Client.customerText_city.getText();
                    array[15] = Client.country.getSelectedItem().toString();
                    array[16] = Client.customerText_phone.getText();
                    array[17] = Client.customerText_email.getText();
                if(Client.rb1.isSelected()){
                        array[18] = Client.rb1_price;
                    }
                    if(Client.rb2.isSelected()){
                        array[19] = Client.rb2_price;
                    }
                    if(Client.rb3.isSelected()){
                        array[20] = Client.rb3_price;
                    }
                    out.flush();
                    out.writeObject(array);
                    //Änderung 23:25 Uhr
//                    out.close();

                    }
                    catch(NumberFormatException e){}
                catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }

                    }
            
            

 }
```

Am Ende jeder Methode sind die close() Methoden auskommentiert. Aber das darf ja eigentlich nicht sein. Ich muss doch in jeder dieser Methoden, die den Inhalt per OutputStream an den Server schicken, die Verbindung mit close() schließen. Aber sobald ich dann folgende Methode aufrufe (siehe unten), bekomme ich eine Exception:


```
static class saveTimer extends Thread{

                public void run() {
                while(true){
                try {
                 
                ObjectInputStream ips = new ObjectInputStream(new     BufferedInputStream(Server.s.getInputStream()));
                BufferedWriter bw = new BufferedWriter(new FileWriter("Client.txt"));

                String[] array = new String[23];
                
                array = (String[])ips.readObject();
                    try {
                        sleep(3000);
                        
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    }
                for(String i : array){
                bw.flush();
                bw.write(i + "\n");
                for(Object o : array){
                    System.out.println(o);
                }
                        
                }
//                bw.close();





                   }
                catch (ClassNotFoundException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }                    catch(IOException e){}
                }
                
                
                
                
                }
                    public void UserRegistration(){
                    try {
                        ObjectInputStream ois = new ObjectInputStream(Server.s.getInputStream());
                        BufferedWriter bw = new BufferedWriter(new FileWriter("Client_Registration.txt"));
                        String[] array_reg = new String[2];
                        array_reg = (String[])ois.readObject();
                        for(String i : array_reg){
                        bw.flush();
                        bw.write(i + "\n");
                        for(Object o : array_reg){
                            System.out.println(o);
                        }

                        }

                
                        
                        
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                            }
                                }
                      }
```

Die Methode saveTimer() soll den Inhalt des Arrays vom Client(siehe die DocumentListener Methoden) in eine Textdatei "Client.txt" schreiben.
Die Methode UserRegistration() soll den Inhalt des Arrays der Methode Registration() aus dem client-coding in eine zweite Textdatei "Client_Registration.txt" schreiben.
Das ist eigentlich alles. Nur, ich verstehe nicht, wie ich wo und wann in welcher Reihenfolge die Streams/Sockets schließen soll :-(


----------



## tuxedo (27. Apr 2009)

sambosoul hat gesagt.:


> RMI ist mir ein Begriff, soll aber laut unserem Prof nicht verwendet werden.



Hö hö, dann nimm "SIMON" :lol:

*just joking*

Gruß
Alex


----------

