Erste Schritte Server will nicht übergebenes Objekt speichern

ubik

Mitglied
Hallo,

kann mir jemand helfen, bin echt am verzweifeln.

Also ich hab einen Server geschrieben:

Java:
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public Server() {
        ServerSocket serversocket = new ServerSocket(9876);
        Counter c = new Counter(50);

        while( true ) {
            Socket socket = serversocket.accept();
            Thread bediener = new ServerHandler(socket, c);
            bediener.start();
          
            System.out.println("Wert " + c.toString());
        }
    }

    public static void main(String[] args) throws Exception {
            Server s = new Server();
    }
}

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.StringTokenizer;
import java.io.StringWriter;




public class ServerHandler extends Thread {
    private Socket so;
    private Counter c;

    public ServerHandler( Socket cs, Counter c) { so = cs; this.c = c; }

    public Counter getCounter() {
        return this.c;
    }

    public void run() {
        try {
            System.out.println(1);
            ObjectInputStream vomClient = new ObjectInputStream( so.getInputStream() );
            StringWriter sw = new StringWriter();
            int c = vomClient.readByte();
            while( c != '\n' ) {
                sw.write( c );
                c = vomClient.readByte();
            }
            String zeile = sw.toString();
            System.out.println(zeile);
            StringTokenizer stok = new StringTokenizer( zeile, " ");
            String objName = stok.nextToken();
            String kommando = stok.nextToken();
                // Feststellen der Objektreferenz zum Objektnamen
            if(kommando.equals("ablegen") ) {
                // Abwickeln des Methodenaufrufs
                Counter counter = (Counter) vomClient.readObject();
                this.c = counter;
                System.out.println(this.c.toString());
                // PrintWriter zumClient = new PrintWriter( so.getOutputStream(), true );
                // zumClient.println("return");
            } else if ( kommando.equals("holen") ) {
                System.out.println("Jetzt holen...");
                ObjectOutputStream zumClient = new ObjectOutputStream( so.getOutputStream() );
                zumClient.writeObject( this.c );
                zumClient.flush();
            } else throw new Exception("Syntaxfehler in Kommando");
            so.close();
        } catch( Exception e) {
            System.out.println("Fehler: " + e );
        }
    }
}

Java:
import java.io.Serializable;

public class Counter implements Serializable {  
    private static final long serialVersionUID = 1L;
    private int count;
  
    Counter() {
        this.count = 0;
    }

    Counter(int z) {
        this.count = z;
    }

    public void incr() {
        this.count++;
    }

    public void decr() {
        this.count--;
    }

    public void resetCounter() {
        this.count = 0;
    }

    public String toString() {
        return String.valueOf(this.count);
    }
}

So. Das ist der Server. Es soll auf dem Server einfach ein Counter-Objekt gespeichert werden, wenn man an den Server "Counter ablegen" schickt. Wenn man an den Server "Counter holen" schickt, dann wird das Counter-Objekt wieder zurückgegeben.

Und hier ist der Client:

Java:
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class CountFrame extends Frame implements Runnable {

    Button bDec = new Button ("<");
    Button bInc = new Button (">");
    Button bQuit = new Button("quit");
    TextField tCounter = new TextField(3);
    Counter c ;
  


    public CountFrame() {
        counterHolen();
    
        tCounter.setEditable(false);
        tCounter.setText(c.toString());      

        // geeignete Beobachter registrieren
        bDec.addActionListener (new ActionListener () {
            public void actionPerformed (ActionEvent e) {
                c.decr();
                tCounter.setText(c.toString());
                counterAblegen();
            }
        });

        bInc.addActionListener (new ActionListener () {
            public void actionPerformed (ActionEvent e) {
                c.incr();
                tCounter.setText(c.toString());
                counterAblegen();
            }
        });

        bQuit.addActionListener (new ActionListener () {
            public void actionPerformed (ActionEvent e) {
                c.resetCounter();
                tCounter.setText(c.toString());
                counterAblegen();
            }
        });

        addWindowListener (new WindowAdapter() {
            public void windowClosing (WindowEvent e) {
                System.exit(0);
            }
        });

        // Komponenten in richtiger Reihenfolge in Panel einfuegen
        Panel p = new Panel(new FlowLayout());
        p.add (bDec);
        p.add (tCounter);
        p.add (bInc);

        // Komponenten in Hauptfenster einfuegen
        add (p, BorderLayout.CENTER);
        add (bQuit, BorderLayout.SOUTH);

        // Fenstergroesse festlegen
        setSize (120, 100);
    }
  
    public void counterHolen() {
            try {  
                Socket so = new Socket( "localhost", 9876 );
              
                ObjectOutputStream zumServer = new ObjectOutputStream( so.getOutputStream());
                zumServer.writeBytes("Counter holen \n");              
                zumServer.flush();
              
                ObjectInputStream vomServer = new ObjectInputStream( so.getInputStream());
                this.c = (Counter) vomServer.readObject();
              
                so.close();
              
            } catch (IOException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

    public void counterAblegen() {
        try {  
            Socket so = new Socket( "localhost", 9876 );
          
            ObjectOutputStream zumServer = new ObjectOutputStream( so.getOutputStream());
            zumServer.writeBytes("Counter ablegen \n");
            zumServer.writeObject(this.c);
          
            zumServer.flush();
          
            so.close();
          
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
    }

  
    public void run() {
        while(true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            counterHolen();          
        }
    }

    public static void main(String[] args) {
        CountFrame countFrame = new CountFrame();
        countFrame.setVisible(true);
        countFrame.run();
    }
}

Wenn ich jetzt den Button drücke, der den Wert inkrementieren soll, passiert, dass der Server kurz 49 erscheint, aber dann wieder 50... :-( Es soll aber bei 49 bleiben!
 
Zuletzt bearbeitet von einem Moderator:
X

Xyz1

Gast
Das ist Spaghetticode. Solche Sachen wie StringWriter oder StringTokenizer dürfen in einer Client-Server-Architektur-Objekte-senden niemals auftauchen. Das Einzigste (falsch geschrieben, ich weiß), was du brauchst, ist:
clientOutputStream.writeObject(joe);
und
employee = (Employee) serverInputStream.readObject(); ...
Auch gibt's entscheidende Nachteile, entscheidet man sich für diese der Kommunikation. BESSER/aufwändiger/eleganter/sicherer: RMI.
Also lösch' das Ganze wieder, befolge meinen Ratschlag, und fang' noch mal von Scratch an [(ganz) von vorne anfangen].

Desweiteren solltest du überlegen, ob Softwareentwicklung/dein Studiengang wirklich richtige ist. Ich möchte kein Programm einstellen, da so aussieht.
 

Meniskusschaden

Top Contributor
Wenn ich jetzt den Button drücke, der den Wert inkrementieren soll, passiert, dass der Server kurz 49 erscheint, aber dann wieder 50... :-( Es soll aber bei 49 bleiben!
Ich glaube, es passiert ungefähr folgendes: Wenn dein Client sich mit dem Server verbindet, startet dieser einen Thread mit einem neuen ServerHandler, dem er das Counter-Objekt des Servers übergibt. Es gibt jetzt also zwei Referenzen auf das Counter-Objekt (eines in Server und eines in ServerHandler).
Der Server Handler bekommt dann vom Client ein Counter-Objekt, dass er in derselben Variablen speichert, in der zuvor das vom Server übergebene Counter-Objekt gespeichert war. Die Variable des Servers referenziert aber noch immer das ursprüngliche Counter-Objekt. Es gibt nun also zwei Counter-Objekte (eines in Server mit dem initialen Wert 50, eines im ServerHandler mit dem Wert 49).
Unmittelbar danach ist der ServerHandler fertig und trennt die Verbindung. Der Thread ist beendet und die Counter-Instanz mit dem Wert 49 existiert nicht mehr, wohl aber die Counter-Instanz in Server, die immer noch den ursprünglichen Wert 50 enthält.
Beim nächsten Abholen durch den Client wird wieder ein neuer ServerHandler-Thread erzeugt und das Spiel beginnt von vorne.
 
X

Xyz1

Gast
Und bei dem war der Aufprall zu hart? ;)

Ist doch nur realistisch.

Ich sag es mal ganz Platt, er bekommt ein Objekt vom Server, verändert es, aber "schreibt es nicht zurück". Ist doch klar, beim nächsten Pull geht die Änderung verloren.

Ich bemängele die Aufteilung der Architektur seiner Anwendung. Ist komplett Nonsens.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
cezary Server läßt sich nicht starten Java Basics - Anfänger-Themen 2
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
V pfad.exists() gilt nicht für "//server/a/xyz.jpg"? Java Basics - Anfänger-Themen 12
M Standard-Klassen auf Server nicht verfügbar Java Basics - Anfänger-Themen 7
G Sessionüberprüfung funktioniert lokal aber nicht auf dem Server! Java Basics - Anfänger-Themen 12
Tandibur Server führt "try-catch" nicht aus Java Basics - Anfänger-Themen 6
ven000m Wieso antwortet mein Server nicht mehr (Socket Anwendung) Java Basics - Anfänger-Themen 2
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
FireHorses Benutzernamen aus PrivateChannel(Interaction) auf Server bringen Java Basics - Anfänger-Themen 0
HolyFUT Best Practice Architektur WebSocket Server Java Basics - Anfänger-Themen 1
S Server Java Basics - Anfänger-Themen 4
S Server Java Basics - Anfänger-Themen 3
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
B DHCP-Server Adresse ermitteln Java Basics - Anfänger-Themen 4
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
R Antwort vom Server an mehreren Clients senden Java Basics - Anfänger-Themen 3
W Netwerkprogrammierung und Http Server Java Basics - Anfänger-Themen 10
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
G sql server connection mit windows authentication Java Basics - Anfänger-Themen 2
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
B IP Adresse von Wildfly Server Java Basics - Anfänger-Themen 1
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
H java.lang.NoClassDefFoundError Run as>> Run on Server Java Basics - Anfänger-Themen 2
F String zu einem Server senden Java Basics - Anfänger-Themen 4
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
T Eclipse - GlassFish Server!? Java Basics - Anfänger-Themen 1
I Java Server Faces mit Glassfish Webseite veröffentlichen Java Basics - Anfänger-Themen 4
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
G Multiple Clients and one Server Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
I JDK SERVER -jar stoppen Java Basics - Anfänger-Themen 5
Screen Wie Propertydatei im Server beschreiben? Java Basics - Anfänger-Themen 7
K threaded server Java Basics - Anfänger-Themen 18
E Client Server Java Basics - Anfänger-Themen 12
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
L Chat server Java Basics - Anfänger-Themen 4
O Server Client Problem Java Basics - Anfänger-Themen 2
B Java Server Side Java Basics - Anfänger-Themen 14
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
G JObjekte dynamisch vom Server erzeugen lassen Java Basics - Anfänger-Themen 4
A Server logs auslesen Java Basics - Anfänger-Themen 6
Z Threads, Server, GUI Java Basics - Anfänger-Themen 4
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
M Java class auf Server starten Java Basics - Anfänger-Themen 5
U Java-Programm auf einem Server starten Java Basics - Anfänger-Themen 33
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
X Applet - Client/Server Java Basics - Anfänger-Themen 2
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
S .Bat Server von .java Starten Java Basics - Anfänger-Themen 5
L Server mit mehreren Clients Java Basics - Anfänger-Themen 25
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
M daytime-Server Port 13 Java Basics - Anfänger-Themen 2
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
O (von Applet) daten an Server übergeben Java Basics - Anfänger-Themen 4
W mehrere clients auf einem server Java Basics - Anfänger-Themen 2
R Server-Daten sichern/verschlüsseln Java Basics - Anfänger-Themen 10
N Applets: Objekte vom Server laden Java Basics - Anfänger-Themen 4
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
F SQL Server aus Umlaute werden Fragezeichen Java Basics - Anfänger-Themen 4
S FTP Server Java Basics - Anfänger-Themen 3
P Application Server Java Basics - Anfänger-Themen 3
B Object an Server senden, Server antwortet mit objekt? Java Basics - Anfänger-Themen 7
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
H Java-Server mit Browser ansprechen Java Basics - Anfänger-Themen 19
Spin Server Location is not an Sun Java System Application Server 8.2 Java Basics - Anfänger-Themen 2
Dit_ Daten vom Server in einer Schleife Java Basics - Anfänger-Themen 4
S In Eclipse relativen Pfad fuer Tomcat Server erstellen..? Java Basics - Anfänger-Themen 3
M Verbindung zu einem Server über Eclipse Java Basics - Anfänger-Themen 6
0 Frage zu Architektur: Server eines kleines Spiels Java Basics - Anfänger-Themen 4
S Chat-Server Java Basics - Anfänger-Themen 6
S Java Applet - Verbindung zum Eigenen Server Java Basics - Anfänger-Themen 2
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
M Socket Server Java Basics - Anfänger-Themen 9
M Problem: JSP für Zugriff auf Oracle-Server/Datenbank - sinnvoll? Java Basics - Anfänger-Themen 35
B Server-Client mit Thread ausstatten Java Basics - Anfänger-Themen 3
brainray Einfachen RMI Server bei einem Provider zum Laufen bringen Java Basics - Anfänger-Themen 3
brainray Server abbrechen mit CTRL-C Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben