Socket Server / Client Anwendung Manipulation von Objekten durch Server

gamebreiti

Mitglied
Hallo liebe Comunity,

ich möchte gern ein Kartenspiel über eine Server / Client - Anwendung laufen lassen. Das Grundgerüst läuft soweit.
Der Server nimmt mehrere Clients an und die Clients können bereits Nachrichten ( Objekte ) an den Server schicken und dieser schickt sie an alle verbundenen Clients zurück.
Nun meine Frage: Ist es möglich, ein vom Client eingetroffenes Objekt im Server zu manipulieren und dann weiter zu senden.
Bisher scheint es so zusein, dass die Manipulation erkannt wird und eine Exeption geworfen wird, weil das eingetroffene Objekt nicht dem weitergesendetem Objekt entspricht. Invalid Streamheader!!!! [ingendeine ID]
Mein Nachricht - Objekt implementiert Serializable....

Also ist es mit Client / Server Prinzip , prinzipiell möglich oder sollte man generell einen anderen Weg einschlagen ?
 

gamebreiti

Mitglied
Okay, vieleicht war meine Frage zu global.

Ich möchte im Server mehrere Clients aufnehmen. Der Server speichert sodann sie OutputStreams des ankommenden Clients in einer ArrayList. Nun soll er die Größe der ArrayList also (size()) an den Client zurücksenden der gerade der Liste hinzugefügt wurde. Beim 1. Client ist die Größe also 1, beim 2. Client ... 2 usw.....
Der Client speichert dieses int in einer Variable sitzplatz.
Doch jedesmal wenn ich das Object auslese und verändern möchte kommt eine Exeption Invalid Streamheader!!!! [ingendeine ID].
 

MisterBu

Aktives Mitglied
Alle Objekte, die Serializable implementieren haben folgende ID:
Code:
  public static final long serialVersionUID = 0;
Die muß für das Objekt auf dem Server und auf dem Client gleich sein.
 

gamebreiti

Mitglied
Okay hier ein bisschen Code:

Serverseite:
Code:
package Programm;

import java.io.IOException;
import java.io_ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class IskaarServer15 {
 
   ServerSocket ss;
   private int sitzplatz;

   //private ObjectInputStream reader;
 
   public static ArrayList <ObjectOutputStream> list_OOS;
   //private boolean goahead;
 
   public static void main(String[] args) {
   
     // eine Instanz der Klasse IskaarServer15 erzeugen
           IskaarServer15 server = new IskaarServer15();
           // Abfrage ob Server gestartet wurde
           if(server.runServer()){
             // warte auf Clients
             server.listenToClients();
           }
           else{
             // tue nix
           }
   }
   public void listenToClients() {
     // Endlos warten auf Clients und verarbeiten
     while(true){
       try {
         // hier wird auf Clients gewartet
         Socket client = ss.accept();
       
         /* neuen ObjectOutputStream erzeugen und den ObjectOutputStream
          * vom eingetroffenen Client darin speichern
          */
       
         ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
 
         // den zwischengespeicherten ObjectOutputStream des Clients der OOSListe hinzufügen
         list_OOS.add(oos);
         sitzplatz = list_OOS.size();
         oos.flush();
         // Ausgabe in der Konsole wievielter Client angemeldet ist
         System.out.println("Spieler " + list_OOS.size() + " wurde dem Spiel hinzugefügt");
         /* Eine neuen Thread für den eingetroffenen Client erzeugen und starten,
          * die Threads werden durch einen Handler verwaltet
          */
         Thread clientThread = new Thread(new ClientHandler(client,sitzplatz));
         clientThread.start();
       
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
   
   }
   public boolean runServer() {
     try{
       ss = new ServerSocket(5555);
       System.out.println("Server wurde gestartet, und läuft auf Port: " + ss.getLocalPort());
       list_OOS = new ArrayList<ObjectOutputStream>();
     
     return true;
     }
     catch(IOException e){
       e.printStackTrace();
       return false;
     }
   }
 

}

Clientseite (Clienthandler):

Code:
package Programm;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Iterator;


public class ClientHandler implements Runnable, Konstanten {
    // globale Variablen
    private Socket client;
    private int sitzplatz;
    private Setup s ;
    private ObjectInputStream ois;
   
   
    // hier wird festgelegt was ein Client tun kann**************************
    public ClientHandler(Socket client,int sitzplatz) {
        try {

            this.client = client;
            this.sitzplatz = sitzplatz;
           
            // hier wird alles gespeichert, was vom Client ankommt
            ois = new ObjectInputStream(client.getInputStream());
            sendBack(sitzplatz);
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    // Endlos - horchen ob was ankommt und an alle Clients zurück senden.
    @Override
    public void run() {
        Object message;
        try {
            message = (Object)client.getInputStream();
            try {
                message = ois.readObject();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        } catch (IOException e1){
            e1.printStackTrace();
        }
        try{
        while((message = ois.readObject()) != null){
            sendToAllClients(message);
        }
        }
        catch(Exception e){
           
        }
    }
    private void sendToAllClients(Object message) {
        // erzeugt einen Iterator der die Liste der ClientObjectOutputStream durchläuft
        Iterator<ObjectOutputStream> it = IskaarServer15.list_OOS.iterator();
       
        // hier wird die Liste solange durchlaufen bis kein Element enthalten ist
        while(it.hasNext()){
            // einen neuen ObjectOutputStream erzeugen und den ObjectOutputStream vom Client darin speichern
            ObjectOutputStream writer = (ObjectOutputStream)it.next();
            try {
                writer.writeObject(message);
                writer.flush();
                }
             catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private void sendBack(int sitzplatz){
   
        // hier wird die Liste solange durchlaufen bis kein Element enthalten ist
               
    }
}

Das Objekt welches verschickt wird: (Setup)

Code:
package Programm;

import java.io.Serializable;
import java.util.ArrayList;

public class Setup implements Serializable{
   
    /**
     *
     */
    private static final long serialVersionUID = 1L;
   
    private ArrayList<String> deck = new ArrayList<String>();
    private int numbersOfPlayer;
    private int playerPos = 1;
    private String playerName;

    private String deckName = null;
   
    public Setup(int numbersOfPlayer,int playerPos,String deckName, ArrayList<String> deck, String playerName) {
        this.numbersOfPlayer = numbersOfPlayer;
        this.deck = deck;
        this.deckName  = deckName;
        this.playerName = playerName;
        this.playerPos = playerPos;
    }

    public String getPlayerName() {
        return playerName;
    }

    public ArrayList<String> getDeck() {
        return deck;
    }

    public int getNumbersOfPlayer() {
        return numbersOfPlayer;
    }

    public String getDeckName() {
        // TODO Auto-generated method stub
        return deckName ;
    }

    public int getPlayerPos() {
        return playerPos;
    }

    public void setPlayerPos(int playerPos) {
        this.playerPos = playerPos;
    }
   
}

Ich bin mir ziemlich sicher, dass das Objekt im Clienthandler manipuliert werden kann.

Wie macht man soetwas richtig.

Im oberen try / catch vom Clienthandler bekomme ich immer eine Cannot Cast Exeption, wenn ich das Objekt mit ois.readObject() auslese, also sowas hier mache.

Code:
    Object message;
        try {
            message = (Object)client.getInputStream();
            try {
                message = ois.readObject();
                Setup s = (Setup)message;
                s.setPlayerPos(sitzplatz);
               
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        } catch (IOException e1){
            e1.printStackTrace();
        }
 

gamebreiti

Mitglied
Okay ... also ich brauche ein message-Object um abzufragen, ob der ObjectinputStream null oder eben ungleich null ist, solange er ungleich null ist soll die message an alle Clients gesendet werden.

Ich habe auch schon versuch auf s != null (das ist das Setup - Objekt) zu überprüfen, aber dann bleibt er in der Schleife hängen.

Wie ist das jetzt? , wird der InputStream nach dem read()-Aufruf auf null gesetzt?? Also quasi reset() automatisch aufgerufen? Sodass der Inputstream wieder frei ist???

Oder hab ich das falsch verstanden?
 

gamebreiti

Mitglied
Ich glaube ich befrage nochmal meine Insel zu dieser speziellen Sache.

Aber Danke Schön!!!!! .... Ich habe die o.g. Codezeile im Clienthandler und im Client gelöscht.

Dann die update-Methode für den ersten Kontakt und dann in der Schleife nochmals aufegerufen und
siehe da, es funktioniert und KEINE Exeption mehr. Juhu.......

Handler:
Code:
public void run() {
        Object message;
        try {
            try {
              
                message = ois.readObject();
                s = (Setup)message;
                s.setPlayerPos(sitzplatz);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
        } catch (IOException e1){
            e1.printStackTrace();
        }
        try{
        while((message = ois.readObject()) != null){
            s = (Setup)message;
            s.setPlayerPos(sitzplatz);
            sendToAllClients(s);
        }
        }

Client :
Code:
public void run() {
        // Endlos hören was vom Server ankommt
        Object message;
        try {
            try {
                message = ois.readObject();
                Setup s = (Setup)message;
        System.out.println("Spieler "+ s.getPlayerPos() + " setzt sich an den Tisch.");
      
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (IOException e1){
            e1.printStackTrace();
        }
        try{
            // wenn eine Nachricht vom Server kommt updaten
            while((message = ois.readObject()) != null){          
                update(message);
                }
          
          
        }
        catch(Exception e){
            e.printStackTrace();
        }
        sendToServer(true);
    }
  
}


Lieben Gruß Breiti
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
S Socket Einfache Client/Server-Anwendung Netzwerkprogrammierung 11
W Server-Client Anwendung Netzwerkprogrammierung 2
E Erste Server-Client Anwendung Netzwerkprogrammierung 2
B Server / Client Anwendung, Client GUI Probleme Netzwerkprogrammierung 11
P Mp3s Streamen - Client-Server-Anwendung Netzwerkprogrammierung 17
A Verständnisproblem mit Client/Server-Anwendung Netzwerkprogrammierung 20
S Server - Client Anwendung Netzwerkprogrammierung 3
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
K C# Server - Android Client Netzwerkprogrammierung 0
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
E Thematik Client server Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
J Client Server - Serialisierung Netzwerkprogrammierung 8
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
K Client => Server Netzwerkprogrammierung 2
A ? Home-Network, Server/Client-Einrichtung Netzwerkprogrammierung 4
S Socket Server: ConnectionError vom Client erkennen Netzwerkprogrammierung 31
A Java Server - IOS Client Applikation Netzwerkprogrammierung 20
L Ratschlag zur Umsetzung einer client-server-Kommunikation Netzwerkprogrammierung 6
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
N Client-Server-Datenbank Netzwerkprogrammierung 13
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
B Client/Server Connection Problem Netzwerkprogrammierung 2
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
R Server zu Client Kommunikation Netzwerkprogrammierung 11
D TCP Verbindung (Java Client und Visual Basic Server) Netzwerkprogrammierung 12
S Socket Applet Client bekommt keine GLOBALE Verbindung zum Server Netzwerkprogrammierung 25
T Server und Client verbinden nicht Netzwerkprogrammierung 6
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
V Socket UDP Server/Client Kommunikation sehr langsam Netzwerkprogrammierung 2
das-mo Client/Server sendet nicht Netzwerkprogrammierung 7
Z Socket Server/Client vernünftiger Verbindungsabbruch Netzwerkprogrammierung 4
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
F TCP Server/Client Netzwerkprogrammierung 14
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
N eine klasse mit server & client Netzwerkprogrammierung 5
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12
T Socket Client versucht zyklische Verbindung zum Server Netzwerkprogrammierung 4
F Socket Server/Client Kommunikation Netzwerkprogrammierung 4
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
D Projektstruktur / Architektur (Client-Server) Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben