Socket Daten in Textdokument speichern?

a_styllez

Neues Mitglied
Hallo,

ich habe ein Problem. Ich muss ein Programm schreiben, welches die eingegeben Daten vom Client beim Server in einem Textdokument speichert. Es geht hierbei um eine einfache Abfrage. Ich habe die Verbindung hinbekommen, die Abfragen etc. läuft alles wunderbar.

Mein einziger Fehler ist, dass ich es nicht hinbekomme, das wenn ich den Server beende und neustarte und versuche die Daten aus der vorherigen Session zu holen, es nicht funktioniert. Das heißt die Daten werden nicht persistent gespeichert oder können nicht gelesen werden. Ich weiß nicht wo der Fehler liegt.

Ich poste hier meine 4 Klassen, alles ist schön ausdokumentiert. Ich hoffe ihr könnt mir helfen.

Die Klasse Server
Java:
package Aufgabe_4_1;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {

    private final static int PORT = 7824;
    private static ServerSocket serverSocket;
    private static Socket socket;
    private static ExecutorService pool;
    static QueryInit qi = new QueryInit();

    public static void main(String args[]) {
        try {
            //eine bound connection mit einen port
            serverSocket = new ServerSocket(PORT);
            //generiert eine fixe anzahl an thread auf ein unbound connection
            pool = Executors.newFixedThreadPool(10);
            System.out.println("Threadpool generated, Server waiting for clients...");

            while (true) {
                socket = serverSocket.accept();
                //aufgrund des startens der Thread muss ich runnable implementieren
                Runnable task = new RunTask(socket);
                pool.execute(task);
            }


        } catch (IllegalArgumentException | SecurityException | IOException e) {
            e.printStackTrace();
            //explziter shutdown
            pool.shutdown();
        }
    }

    /**
     * Statische innere Klasse
     * RunTask welche Runnable implementiert, sie erstellt Instanzvariablen
     * Dem Konstruktor initialisiert
     */
    static private class RunTask implements Runnable {
            private Socket myConnection;
            private ObjectOutputStream outStream;
            private ObjectInputStream inStream;
            private String message = null;

            //konstruktor der ein socket erwartet
            public RunTask(Socket connection) {
                this.myConnection = connection;
                try {
                    outStream = new ObjectOutputStream(myConnection.getOutputStream());
                    inStream = new ObjectInputStream(myConnection.getInputStream());
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("Warning: Streams are invalid");
                }

            }

            /**
             * Die Run Methode wird als Serverteil komplett ausgeführt und übernimmt die Anfragen vom Client und bearbeitet diese jeweils
             * Alles läuft in einen try block ab um eventuelle Fehler fangen zu können
             */
            public void run() {
                try {
                    /**
                     * Die Abfrage erfolgt hier zum Client. Der Server bekommt dasselbe zu sehen wie der Client
                     */
                    System.out.println("Connected to: " + socket.getInetAddress().getHostName());
                    message = "Do you brush your teeth before you go sleep? " + "\nYou can answer with yes, no and other";
                    //schreibt und sendet den String im UTF8 Format
                    outStream.writeUTF(message);
                    outStream.flush();
                    System.out.println("Server: " + message);

                    /**
                     * Hier wird die Antwort des Clients eingelesen und versucht zu speichern
                     * Schleife wird abgebrochen, wenn eine Antwort einkommt
                     */
                    while (true) {
                        //antwort einlesen / auf anfrage warten
                        message = inStream.readUTF();
                        System.out.println(myConnection.getInetAddress().getHostName() + ": " + message);
                        //wenn eine antwort ausgewählt wurde, soll diese im textdokument gepeichert werden
                        if(message.equals("yes") || message.equals("no") || message.equals("other")){
                           //Todo: Dieses objekt muss vielleicht statisch sein
                            //QueryInit qi = new QueryInit();
                            qi.save(message);
                            break;
                        }else{
                            //wenn was falsches gesendet wird, dann soll wrong ausgegeben werden
                            message = "Wrong Input! Please answer with yes, no or other";
                            outStream.writeUTF(message);
                            outStream.flush();
                            System.out.println("Server: " + message);
                        }
                    }

                    /**
                     * Wenn alles richtig war, dann soll er fragen ob der Client den aktuellen Status sehen will
                     */
                    message = "Thank you for be a part of answering \nDo you wanna know your actual status? \nyes or no?";
                    outStream.writeUTF(message);
                    outStream.flush();
                    System.out.println("Server: " + myConnection.getInetAddress().getHostName() + ": " + message);

                    /**
                     * Hier antwortet der Client, bei yes bekommt er seinen aktuellen Status, bei no wird die Verbindung geschlossen
                     */
                    while (true){
                        //antwort einlesen, anfrage warten
                        message = inStream.readUTF();
                        System.out.println(myConnection.getInetAddress().getHostName() + ": " + message);
                        //falls antwort ja, dann zeig mir die aktuellen ergebnisse
                        if(message.equals("yes")){
                            //QueryInit qi2 = new QueryInit();
                            message = qi.showSDS();
                            outStream.writeUTF(message);
                            outStream.flush();
                            //falls nein, dann weiter
                        }else if(message.equals("no")){
                            message = "finish";
                            outStream.writeUTF(message);
                            outStream.flush();
                            break;
                        }else{
                            message = "wrong input";
                            outStream.writeUTF(message);
                            outStream.flush();
                            System.out.println("Server an " + myConnection.getInetAddress() + ": " + message);
                        }
                    }

                    /**
                     * Hier wird die Verbindung geschlossen, wenn der client bei der abfrage ob er den aktuellen Status
                     * einsehen will, no geantwortet hat
                     */
                    //Streams schließen, Verbindung schließen
                    myConnection.shutdownOutput();
                    myConnection.shutdownInput();
                    myConnection.close();
                    System.out.println("Connection " + myConnection.getInetAddress().getHostName() + " closed");
                    }catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }


Die Klasse Client
Code:
package Aufgabe_4_1;


import java.io.*;
import java.net.Socket;
import java.net.SocketException;

public class Client {
    public static void main(String[] args) throws IOException {

        /**
         * verbindungsaufbau zu diesen socket
         */
        String serverName = "localhost";
        int portNr = 7824;
        System.out.println("Open Socket to " + serverName + " up " + portNr);
        Socket socket = new Socket(serverName, portNr);

        /**
         * sowohl instanziierung als auch ablauf des clients im try block
         */
        try {
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
            String message = null;
            System.out.println("Connected to: " + socket.getInetAddress().getHostName());

            /**
             * einlesen und abarbeiten, while-schleife läuft solange bis client oder server abbricht
             */
            while (true) {
                try {
                    //liest einen utf 8 format String
                    message = in.readUTF();
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }

                /**
                 * wenn user irgendwas falsches eingetippt hat
                 */
                if (message.equals("wrong")) {
                    System.out.println(socket.getInetAddress().getHostName() + " : Please choose another an answer");
                }
                if (message.equals("finish")) {
                    break;
                } else {
                    System.out.println(socket.getInetAddress().getHostName() + " : " + message);
                }

                /**
                hier überprüfe ich die verbindungseinstellungen
                 */
                if (socket.isConnected() == false) {
                    System.out.println("finish");
                    break;
                }
                if (socket.isInputShutdown()) {
                    System.out.println("finish");
                    break;
                }
                if (socket.isOutputShutdown()) {
                    System.out.println("finish");
                    break;
                }
                if (socket.isBound() == false) {
                    System.out.println("finish");
                    break;
                }

                /**
                 *liest die eingegebene message ein für die abfrage vom server ob ich meine daten einsehen will
                 */
                message = keyboard.readLine();
                try {
                    out.writeUTF(message);
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }

            System.out.println("Connection closed");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}


Die Klasse SDS
Code:
package Aufgabe_4_1;


import java.io.Serializable;

/**
* SDS = Stammdatensatz
*/
public class SDS implements Serializable {

    public int yes = 0;
    public int no = 0;
    public int other = 0;
}


Die Klasse QueryInit
Code:
package Aufgabe_4_1;


import java.io.*;

public class QueryInit implements Serializable {

    SDS sds = new SDS();
    String filename = "Umfrage-Ergebnisse.txt";

    /**
     * Diese Methode verarbeitet die Antwort vom Client und schreibt diese in das Textdokument
     * @param answer : String
     */
    public synchronized void save(String answer) {
        System.out.println("Start Initialisation");
        try {
            //file in die daten gespeichert werden können
            FileOutputStream fos = new FileOutputStream(filename);
            //speichere objekte in dieser file
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            //liefer mir die datensätze
            this.sds = getSDS();

            //zähl mir die stimmen hoch
            if (answer.equals("yes")) {
                this.sds.yes++;
            } else if (answer.equals("no")) {
                this.sds.no++;
            } else if (answer.equals("other")) {
                this.sds.other++;
            }
            //schreibe mir das den stammdatensatz als objekt in meine file
            oos.writeObject(this.sds);
            oos.flush();
            //Schliess mir den stream
            oos.close();
            fos.close();
            System.out.println("Stream closed, Data saved");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Diese Methode holt mir den aktuellen Stand aus meiner File heraus.
     * @return sds : SDS
     */
    private SDS getSDS() {

        try {
            //offne mir den stream auf mein file
            FileInputStream fos1 = new FileInputStream(filename);
            //lese objekte in diesem file aus
            ObjectInputStream oos1 = new ObjectInputStream(fos1);
            this.sds = (SDS) oos1.readObject();

            //neue schreibweise, verknüpfung von vielen exception aufeinmal
        } catch (NullPointerException | ClassNotFoundException | IOException e) {
            System.out.println("Nothing to read");
        }
        //setz mir alles auf 0, wenn objekt nicht beschrieben
        if(this.sds == null){
            this.sds.yes = 0;
            this.sds.no = 0;
            this.sds.other = 0;
        }
        return this.sds;
    }

    /**
     * Diese Methode verschönert mir die Ausgabe
     * @return message : String
     */
    public String showSDS (){
        this.sds = getSDS();
        String message = "Actual results: \nyes: " + this.sds.yes + " \nno: " + this.sds.no + " \nother: " + this.sds.other;
        return message;
    }

}
 

TheWhiteShadow

Bekanntes Mitglied
Du öffnest die Datei gleichzeitig mit einem FileOutputStream und einem FileInputStream. Das funktioniert nicht. Setze die Zeile this.sds = getSDS(); vor dem Erstellen des FileOutputStream's.

Darüber hinaus ist der Abschnitt
Java:
if(this.sds == null){
            this.sds.yes = 0;
            this.sds.no = 0;
            this.sds.other = 0;
        }
Müll!
Wäre der Fall nicht durch das initiale Setzen des Feldes ausgeschlossen, würde der Code eine NullPointerException erzeugen.
Besser wäre:
Java:
if(this.sds == null) { this.sds = new SDS(); }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S Daten über TCP/IP senden Netzwerkprogrammierung 3
B Daten an Javaprogramm per URI Aufruf übergeben Netzwerkprogrammierung 7
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
C Spezielle Daten aus Website entnehmen Netzwerkprogrammierung 5
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S Fakturierungsprogramm - Daten aktuell halten (blutiger Anfänger) Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
K Server liest Daten nicht Netzwerkprogrammierung 6
L HTTP Daten an Server übergeben Netzwerkprogrammierung 2
R Daten von Cloud laden Netzwerkprogrammierung 5
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
P Socket Best Practice: Daten bündeln Netzwerkprogrammierung 5
E Verfügbarkeit von Daten in Streams Netzwerkprogrammierung 4
F Daten aus Internetseiten auslesen Netzwerkprogrammierung 56
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
J Applet soll Daten auf Server ablegen - einfachster Weg fuer n00bs? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
F UDP Daten kommen nicht an Netzwerkprogrammierung 22
E Socket OutputSream abbruch.Wegen zuviel !empfangener! Daten? Netzwerkprogrammierung 10
C Client zu Client Daten übertragen Netzwerkprogrammierung 13
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Socket XML-Daten und Parameter an Server schicken Netzwerkprogrammierung 3
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
K Socket Daten lesen ohne Längenangabe Netzwerkprogrammierung 19
T RMI Effizenteste Übertragung von Daten Netzwerkprogrammierung 6
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
E Daten kommen anders an als gesendert ?! Netzwerkprogrammierung 6
S HttpURLConnection POST splittet Daten in zwei Pakete Netzwerkprogrammierung 9
F POST-Daten sende Netzwerkprogrammierung 3
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
N Per POST -Methode Daten an den Web-Server übertragen. Netzwerkprogrammierung 9
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
M Ethernet Daten abfangen Netzwerkprogrammierung 13
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
S Daten per GET-Methode Netzwerkprogrammierung 2
H Server soll Daten schicken, aber wie? Netzwerkprogrammierung 47
M Socket schließt bevor Daten komplett geladen Netzwerkprogrammierung 5
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
M Daten übers Netz verschlüsselt übertragen? Wie? Netzwerkprogrammierung 18
J Post-Daten an URL schicken Netzwerkprogrammierung 2
U Image erzeugen aus empfangenen Daten Netzwerkprogrammierung 7
A Wie werden Daten versendet? "Crashcode" Netzwerkprogrammierung 4
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
E Multi-Part Form-Daten mit HttpURLConnection Netzwerkprogrammierung 6
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
T Daten über GSM verschicken Netzwerkprogrammierung 4
M Einfachste Möglichkeit aus'm Applet Daten an Server senden Netzwerkprogrammierung 6
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
M Verliere Daten mit WinXP Netzwerkprogrammierung 10
O eingehende Daten speichern Netzwerkprogrammierung 3
D UDP-Daten anzeigen Netzwerkprogrammierung 2
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
A daten an php script per post senden und ausgabe einlesen Netzwerkprogrammierung 6
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
F String in Datenbank speichern Netzwerkprogrammierung 1
B Socket BufferedImage senden "ohne speichern" Netzwerkprogrammierung 7
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
H Applet soll XML-File auf Server speichern Netzwerkprogrammierung 6
G Video aus RTSP Stream speichern Netzwerkprogrammierung 8
S oAuth Key's verstecken/verschlüsseln/speichern Netzwerkprogrammierung 6
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
F Highscore online speichern Netzwerkprogrammierung 14
E stream speichern Netzwerkprogrammierung 5
C Datei auf server speichern Netzwerkprogrammierung 16
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
J VideoStream von Webseite lesen/speichern Netzwerkprogrammierung 7
A Einfachste Möglichkeit online zu speichern? Netzwerkprogrammierung 28
A attachment einer Mail speichern Netzwerkprogrammierung 5
G Bild aus PHP-seite speichern Netzwerkprogrammierung 7
D Content einer email in sql-datenbank speichern Netzwerkprogrammierung 9
L Web-Seiten Inhalt auslesen und in textfile speichern Netzwerkprogrammierung 2
B Datei speichern unter Netzwerkprogrammierung 10
T Html-Source über URL in einen String speichern? Netzwerkprogrammierung 16
T Datei, auf einem Netzwerkrechner speichern. Netzwerkprogrammierung 11

Ähnliche Java Themen


Oben