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

Status
Nicht offen für weitere Antworten.

sambosoul

Mitglied
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:
Code:
 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:
Code:
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

Top Contributor
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

Mitglied
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.

Code:
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.

Code:
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:

Code:
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

Top Contributor
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

Mitglied
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:

Code:
 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

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
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?
 

sambosoul

Mitglied
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.

Java:
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
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
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

Mitglied
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

Top Contributor
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

Top Contributor
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

Mitglied
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:

Code:
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:

Code:
 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 :-(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
J Datei Download vom Server Netzwerkprogrammierung 8
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
Aruetiise Socket Datei Endung Netzwerkprogrammierung 6
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
K HTTP Formulare füllen und Datei downloaden Netzwerkprogrammierung 23
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
A Datei erzeugen und auf der Weboberfläche downloaden (Tomcat) Netzwerkprogrammierung 4
Sogomn HTTP Datei herunterladen Netzwerkprogrammierung 13
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
F FTP Einzelne Datei von FTP-Server überprüfen Netzwerkprogrammierung 0
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
S Datei(XML) per RMI an Server schicken Netzwerkprogrammierung 0
V Datei Download Fenster Netzwerkprogrammierung 9
S Datei schreiben über Applet Netzwerkprogrammierung 8
C Socket Datei Übertragung Netzwerkprogrammierung 5
D Datei hochladen zu PHP Server Netzwerkprogrammierung 8
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
H Datei in DropBox schreiben Netzwerkprogrammierung 23
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
V Datei auf Server Schreiben Netzwerkprogrammierung 18
N Einen Server als ausführbare Datei exportieren Netzwerkprogrammierung 15
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
C Datei auf server speichern Netzwerkprogrammierung 16
P FTP Nochmal wachsende Datei per FTP lesen Netzwerkprogrammierung 9
W Datei automatisiert kopieren! Netzwerkprogrammierung 5
P Wachsende Datei per FTP lesen Netzwerkprogrammierung 2
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
G Txt datei von Website downloaden Netzwerkprogrammierung 8
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
S ActiveMQ, JMS und Datei übertragen Netzwerkprogrammierung 25
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
U Web Datei downloaden und bei Änderungen wieder zurückspielen Netzwerkprogrammierung 5
M Class-Datei aus Eclipse mit Xampp Netzwerkprogrammierung 4
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
B Zugriff auf eine Text- und XML-Datei Netzwerkprogrammierung 4
Dit_ FTP, Datei Hochladen Netzwerkprogrammierung 4
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
J Datei übertragen ja String + datei übertragen nein Netzwerkprogrammierung 5
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
N Socket TCP Datei Transfer Netzwerkprogrammierung 2
L Java über php datei lesen? Netzwerkprogrammierung 18
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
weeego Ping über CMD, Umweg über Batch Datei sparen. Netzwerkprogrammierung 17
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
U Datei via UDP Netzwerkprogrammierung 8
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
S Error 404 obwohl die Datei existiert Netzwerkprogrammierung 9
T Datei Herunterladen und ausführen Netzwerkprogrammierung 5
S Mittels Java XML abfragen und nicht die Ausgabe-HTML-Datei Netzwerkprogrammierung 5
C PCAP Datei auslesen Netzwerkprogrammierung 8
F Applet Datei Zugriff Netzwerkprogrammierung 13
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
M [Commons NET] Prüfen, ob auf FTP Datei vorhanden ist Netzwerkprogrammierung 2
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
C Dateiübertragung - Datei immer ein 4096faches von n Netzwerkprogrammierung 2
E Applet zum Datei-Upload Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
J Gibts die Datei? Netzwerkprogrammierung 3
K Datei-Upload per FTP Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
S über rmi datei übertragen? Netzwerkprogrammierung 2
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
G.I.Joe Datei per POST übertragen Netzwerkprogrammierung 2
B Umfangreiche Batch Datei (Rmiregistry prüfung + Prog. start) Netzwerkprogrammierung 4
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
F Datei senden und empfangen Netzwerkprogrammierung 4
B Via Java Datei zu PHP-Script auf Apache hochladen Netzwerkprogrammierung 4
B knacken bei download von mp3 datei Netzwerkprogrammierung 2
T Datei senden Netzwerkprogrammierung 3
M Datei auf Remoteserver kopieren Netzwerkprogrammierung 8
B Datei speichern unter Netzwerkprogrammierung 10
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8
T Musik-Stream: Server sendet die Datei zu schnell ? Netzwerkprogrammierung 3
T Mit FTP verbinden, einen Ordner erstellen und Datei löschen Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben