Objekte versenden, Client-Server

Einstein97

Mitglied
Hallo liebe Community,
ich versuche zur Zeit eine Client-Server-Anwendung zu schreiben, bei der ich Client und Server durch ObjectStreams miteinander verbinde. Anschließend würde ich dann gerne ein String Objekt testweise zum Server schicken und dort ausgeben lassen.
Leider kommt dort aber nichts an...die Verbindung scheint zwar zu bestehen und ich erhalte auch keinerlei Exceptions, aber trotzdem erhalte ich meinen String auf dem Server nicht...
Ich versuche nun mal, möglichst nur den relevanten Code zu zitieren, vielleicht fällt jemandem ja sofort ein Fehler auf.
Liebe Grüße

Hier erzeuge ich einen Client aus meiner Client-Klasse, welcher sich mit dem Server verbindet.
Dann erstelle ich ein Objekt meiner MessageObject-Klasse, welches ich dann mithilfe der Methode sendName() versenden will.
Java:
public class ClientMain {
 
    public static void main(String[] args) {
       
        Client user= new Client("localhost",5553);
        MessageObject userName= new MessageObject("Test");
        user.sendName(userName);
       
    }
}

Im Server möchte ich dann mit der Methode getName() den String erhalten.
Java:
public class ServerMain {
 
    public static void main(String[] args) {
       
        Server server= new Server(5553);
        server.getName();
    
    }
 
}

Die Objekte dieser Klasse möchte ich versenden, daher implementiere ich das MarkerInterface Serializable.
Java:
public class MessageObject implements Serializable {
   
    private static final long serialVersionUID=1;
 
    String userName;
   
    public MessageObject(String name){
        this.userName= name;
    }
   
}

Java:
public class Client {
   
    Socket server;
    ObjectOutputStream out= null;
    ObjectInputStream in= null;
    MessageObject ob;
   
    public Client(String host, int port){
        try {
            server= new Socket(host, port);
            out = new ObjectOutputStream(server.getOutputStream());
            in = new ObjectInputStream(server.getInputStream());
        } catch (UnknownHostException e) {
              e.printStackTrace();
        } catch (IOException e) {
              e.printStackTrace();
        }
    }
   
    public void sendName(MessageObject o){
        try {
            out.writeObject(o);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
}

Java:
public class Server {
   
    MessageObject ob;
    ServerSocket server;
    Socket player;
    ObjectOutputStream out= null;
    ObjectInputStream in= null;
   
    public Server(int port){
       
          try {
            server= new ServerSocket(port);
            System.out.println("Server started...!");
            while(true){
                  player=server.accept();
                  System.out.println("New Player connected: "+ player.getInetAddress().toString());
               
                  out= new ObjectOutputStream(player.getOutputStream());
                  in= new ObjectInputStream(player.getInputStream());
               
            }
          } catch (IOException e1) {
              e1.printStackTrace();
          } finally{
              try {
                player.close();
                out.close();
                in.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
    }
   
    public void getName(){
        try {
          ob = (MessageObject) in.readObject();
          System.out.println(ob);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
}
 

Jardcore

Top Contributor
Du solltest innerhalb der Schleife prüfen ob etwas angekommen ist.
Dein server.getName() wird aktuell nur einmal nach dem Start des Servers aufgerufen.

Also getName() in die Schleife ziehen und in getName() noch eine Null-Prüfung vor dem cast hinzufügen. Für die Ausgabe des Names musst du dann natürlich noch getName() des MessageObjects aufrufen.

while(true) Schleifen sollte man übrigens vermeiden und getName ist auch ein komischer Name^^ vllt
checkRequest() :)

Beste Grüße,
Jar
 

Einstein97

Mitglied
Hallo Jar, danke für die Antwort.
Vermutlich habe ich da etwas falsch verstanden, es funktioniert leider noch nicht...
Ich soll also in der Klasse Server im Konstruktor das getName in der Schleife verwenden?
Also dann this.getName() ?

Und dann die Nullprüfung in der Methode:
Java:
public void getName(){
        try {
          if(in.readObject() != null){
            ob= (MessageObject) in.readObject();
            System.out.println(ob);
          }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

Viele Grüße
Einstein97
 

mrBrown

Super-Moderator
Mitarbeiter
#getName wird bisher nie ausgeführt, weil im Konstruktor die Endlosschleife gestartet wird (was nicht gut ist - im Konstruktor nur das Objekt erstellen, keinen Logik starten). Sinnvoller wäre es, die Schleife in eine extra Methode auszulangen, und die in der #main aufzurufen. Und in der Schleife wie schon gesagt #getName aufrufen
 

Einstein97

Mitglied
Guten Morgen,
ich habe das Programm nun nochmals umstrukturiert und beispielsweise auch die Endlosschleife aus dem Konstruktor genommen.
Dennoch funktioniert die Übertragung des Objektes leider nicht...es kommt nichts an beim Server. Hier nochmal der relevante Code, wie er aktuell aussieht:
In den jeweiligen Main-Methoden habe ich einen Client und einen Server erzeugt, ich denke, das ist nachvollziehbar und muss nicht gepostet werden. Vom Client aus erzeuge ich dann eine Message vom Typ String und schicke sie mit der sendMes()-Methode los.
Viele Grüße
Einstein97

Java:
public Client(String host, int portNumber){
        try {
            server= new Socket(host, portNumber);
            initializeConnection(server);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
}
 
public void initializeConnection(Socket server){
        try {
            out= new ObjectOutputStream(server.getOutputStream());
            in= new ObjectInputStream(server.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
}
 
public void sendMes(Message mes){
        try {
            out.writeObject(mes);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
}


Java:
public Server(int portNumber, int queueLength){
        try {
            server= new ServerSocket(portNumber, queueLength);
            System.out.println("Server started...!");
            connect(server);
        } catch (IOException e) {
            e.printStackTrace();
        }
}
   
public void connect(ServerSocket server){
        while(true){
            try {
                player= server.accept();
                System.out.println("Connection with new player: "+player.getInetAddress().toString());
                handleConnection(player);
            } catch (IOException e) {
                  e.printStackTrace();
            }
        }
}
   
public void handleConnection(Socket player){
        try {
            out= new ObjectOutputStream(player.getOutputStream());
            in= new ObjectInputStream(player.getInputStream());
            receive();
        } catch (IOException e) {
            e.printStackTrace();
        }
}
   
public void receive(){
        Message ob= null;
        try {
          if (in.readObject()!= null){
            ob= (Message) in.readObject();
            System.out.println(ob);
          }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
}
 

Einstein97

Mitglied
Hallo Jardcore,
in diesem Tutorial wird aber gar nicht mit eigenen Konstruktoren gearbeitet. Von daher weiß ich nicht, wie ich das nun auf mein Programm beziehen soll...:( Komme einfach nicht weiter.
 

mrBrown

Super-Moderator
Mitarbeiter
Wo wird denn überhaupt die Message geschickt?

Zum Problem mit der Endlosschleife, #connect braucht keinen übergebenen ServerSocket, den hast du schon als Instanzvariable. Du kannst also einfach den Aufruf von #connect aus dem Konstruktor nehmen, und es stattdessen aus der #main aufrufen.
 

Einstein97

Mitglied
Hier wird in der ClientMain die Message gesendet:
Java:
public class ClientMain {
 
    public static void main(String[] args) {
       
        Client player= new Client("localhost",6745);
        Message mes= new Message("Test");
        player.sendMes(mes);
   
    }
 
}

Und hier erzeuge ich einen Server in der ServerMain:
Java:
public class ServerMain {
 
    public static void main(String[] args) {
       
        int portNumber= 6745;
        int queueLength= 100;
       
        Server server= new Server(portNumber, queueLength);
        server.connect();
    }
}

Jetzt, wo ich connect() in der main aufrufe, erhalte ich eine SocketException: Connection reset :confused:
 

Einstein97

Mitglied
In der Server-Klasse beim Aufruf von handleConnection(player) in Zeile 30, receive() in Zeile 42 und in der receive-Methode bei ob= (Message) in.readObject(); in Zeile 52.
Code:
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Server.receive(Server.java:52)
    at Server.handleConnection(Server.java:42)
    at Server.connect(Server.java:30)
    at ServerMain.main(ServerMain.java:10)
 

mrBrown

Super-Moderator
Mitarbeiter
Ich kanns grad nicht testen, aber es könnt daran liegen, das direkt nach dem Senden der Client beendet wird, damit wird auch die Verbindung geschlossen, und der Server kann auf die Verbindung nicht mehr zugreifen.

Lösen könnte man das, wenn man im Client nach dem Senden auf eine Antwort wartet
 

Einstein97

Mitglied
Also ich habe jetzt auch noch die receive-Methode in der main() aufgerufen, dann läuft das Programm wieder ohne eine Exception zu werfen.
Java:
public class ServerMain {
 
    public static void main(String[] args) {
       
        int portNumber= 6748;
        int queueLength= 100;
       
        Server server= new Server(portNumber, queueLength);
        server.connect();
        server.receive();
    }
}

Im Server bleibt dann folgendes:
Java:
public Server(int portNumber, int queueLength){
        try {
            server= new ServerSocket(portNumber, queueLength);
            System.out.println("Server started...!");
        } catch (IOException e) {
            e.printStackTrace();
        }
}
   
public void connect(){
        while(true){
            try {
                player= server.accept();
                System.out.println("Connection with new player: "+player.getInetAddress().toString());
                out= new ObjectOutputStream(player.getOutputStream());
                in= new ObjectInputStream(player.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
}
 
public void receive(){
        Message ob= null;
            while(true){
                try {
                    ob= (Message) in.readObject();
                    System.out.println(ob);
                } catch (ClassNotFoundException e) {
                      e.printStackTrace();
                } catch (IOException e) {
                      e.printStackTrace();
                }
            }
       
    }
}

Nur bleibt es dabei, dass die Nachricht nicht zum Server geschickt wird. Zum Verzweifeln. :(
 

Einstein97

Mitglied
Mein Client hat auch eine receive-Methode. Diese sieht genauso aus wie die im Server.
Habe Sie bisher nur nicht hier zitiert, da ich sie für das bloße Senden vom Client zum Server als unwichtig erachtet hatte.
D.h., ich muss jetzt diese receive-Methode im Client auch noch "anwenden", wenn ich etwas zum Server schicke? Den Text im angegeben Link finde ich nämlich etwas irreführend, da die einzelnen Codeabschnitte teilweise doppelt vorkommen, dann nochmals zerlegt werden und man nicht immer weiß, worauf sich der Text dann bezieht :D
 

mrBrown

Super-Moderator
Mitarbeiter
Mein Client hat auch eine receive-Methode. Diese sieht genauso aus wie die im Server.
Habe Sie bisher nur nicht hier zitiert, da ich sie für das bloße Senden vom Client zum Server als unwichtig erachtet hatte.
D.h., ich muss jetzt diese receive-Methode im Client auch noch "anwenden", wenn ich etwas zum Server schicke? Den Text im angegeben Link finde ich nämlich etwas irreführend, da die einzelnen Codeabschnitte teilweise doppelt vorkommen, dann nochmals zerlegt werden und man nicht immer weiß, worauf sich der Text dann bezieht :D
Ja, direkt nach dem Senden muss du auf Antwort warten.
 

Einstein97

Mitglied
Java:
public void sendMes(Message mes){
        try {
            out.writeObject(mes);
            out.flush();
            Message fromServer;
            try {
                while((fromServer= (Message) in.readObject())!= null){
                    System.out.println("Server: "+fromServer);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
}

Habe nun also die sendMes()-Methode des Clients noch um den Teil aus dem Link erweitert.
Verstehe einfach nicht, was das verändern sollte. Bisher habe ich wirklich noch keine einfache Client-Server Anwendung gesehen, in der der Client in dieser Weise auf eine Antwort wartet. Man will doch wirklich nur etwas zum Server schicken.
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn dein Client nur sendet, Beendet er sich danach direkt, und schließt damit auch die Verbindung, der Server kommt also nicht zum Lesen, weil die Verbindung direkt wieder geschlossen ist.

Bisher habe ich wirklich noch keine einfache Client-Server Anwendung gesehen, in der der Client in dieser Weise auf eine Antwort wartet. Man will doch wirklich nur etwas zum Server schicken.
In den meisten Fällen will man auch sichergehen, dass es richtig ankam, und lässt es sich vom Server bestätigen ;)
 

Einstein97

Mitglied
Mhh okay wird wohl so sein :D Jetzt muss ich aber im Server in der receive-Methode auch noch das Zurücksenden einfügen, oder? Also sendMes() auch im Server anwenden...
 

Einstein97

Mitglied
Guten Abend, ich bin's nochmal:D
Das Programm läuft jetzt und ich wollte mich für Eure Hilfe und Geduld bedanken.
Eine kleine Frage habe ich aber trotzdem noch. Das Objekt "Test", welches ich losgeschickt habe, kommt zwar beim Server nun an und wird auf der Konsole ausgegeben, jedoch nicht als String, sondern als Message@76a564 oder sowas in der Art...
Hatte nun versucht das Problem mit instanceof in der receive-Methode zu lösen.

Java:
public void receive(){
        try {
            ob= (Message) in.readObject();
            System.out.println(ob);
            if(ob instanceof String){
                String s= (String) ob;
            }
        } catch (ClassNotFoundException e) {
              e.printStackTrace();
        } catch (IOException e) {
              e.printStackTrace();
        }
}

Jedoch sagt Java mir dann "cannot cast from Message to String".
Wie kann ich das noch lösen? :)
 

Jardcore

Top Contributor
Wieso willst du das auch tun? :) Entweder du implementierst bei Message eine Methode getText() oder getDate() oder ähnlich. Oder du verpasst deinem Message Objekt eine toString() Methode.

"Message@76a564" ist übrigens die Referenz auf dein Message Objekt.

Vielleicht nochmal paar Grundlagen anschauen :p
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Objekte im NIO unblocking mode versenden Netzwerkprogrammierung 11
A Konflikt: Blocking und Non-Blocking bei Objekte versenden Netzwerkprogrammierung 4
P Objekte über DatagramSocket versenden Netzwerkprogrammierung 12
T JSON-Objekte richtig parsen Netzwerkprogrammierung 8
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
C List Deserialisierung entfernt Objekte Netzwerkprogrammierung 2
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
V Socket Objekte werden nicht aktualisiert Netzwerkprogrammierung 2
S Socket Über UDP Objekte verschicken Netzwerkprogrammierung 9
B Eigene Objekte per RMI übergeben Netzwerkprogrammierung 2
S Kapselung der Netz-Objekte Netzwerkprogrammierung 3
B verschiedene Serialisierte Objekte identifizieren? Netzwerkprogrammierung 5
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T Laufen Objekte, die vom Cajo-Server geliefert werden, lokal auf dem Client? Netzwerkprogrammierung 4
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
I Objekte über das Netzwerk Netzwerkprogrammierung 5
M Messenger - String oder Objekte Netzwerkprogrammierung 4
S Netzwerk und Objekte Netzwerkprogrammierung 5
S RMI 1.) Entfernte Objekte "Zwischenspeichern" 2.) Threadsicherheit Netzwerkprogrammierung 2
T rmi ssl zu große Objekte übergeben -> Exception Netzwerkprogrammierung 10
N RMI und Datenbank Objekte Netzwerkprogrammierung 3
R Mittels BufferedReader Objekte lesen? Netzwerkprogrammierung 5
M Objekte senden zwischen Java und PHP mit SOAP Netzwerkprogrammierung 9
A Objekte in übergebenen Objekten mit WebServices? Netzwerkprogrammierung 6
A RMI wie kann ich objekte übergeben? Netzwerkprogrammierung 5
P Serialialiserte Objekte übers Netzwerk verschicken Netzwerkprogrammierung 9
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
T E-Mail versenden. Netzwerkprogrammierung 8
L Versenden von "Bildschirm" Netzwerkprogrammierung 2
L Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException Netzwerkprogrammierung 10
precoc String Array versenden Netzwerkprogrammierung 7
B Viele verschiedene E-Mails an unterschiedliche Empfänger schnell versenden? Netzwerkprogrammierung 8
S Email via Googlemail versenden Netzwerkprogrammierung 17
M Mail über Exchange versenden Netzwerkprogrammierung 13
P Dateiennamen versenden Netzwerkprogrammierung 4
P Mit Java Javascript-Anfrage versenden Netzwerkprogrammierung 4
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
C An WebDAV einen "MKCOL" Befehl versenden Netzwerkprogrammierung 4
X Versenden von Objekten braucht zu lange Netzwerkprogrammierung 5
N Technologie zum versenden von Objects Netzwerkprogrammierung 5
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
N E-mail versenden Netzwerkprogrammierung 4
B Wie HTTP GET/POST Anfrage versenden? Netzwerkprogrammierung 7
T SWT Image versenden Netzwerkprogrammierung 2
T Einzelne Bits per Socket versenden Netzwerkprogrammierung 16
F Link erzeugen und versenden Netzwerkprogrammierung 4
O Wert versenden? Netzwerkprogrammierung 12
G Datein versenden funktioniert nicht ! Netzwerkprogrammierung 19
S Objekt Felder versenden Netzwerkprogrammierung 5
O Über Socket Array versenden Netzwerkprogrammierung 5
G Bytes versenden Netzwerkprogrammierung 9
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
B Strings versenden | Nur 1 Client Netzwerkprogrammierung 6
V Kann keine DatagramPackets versenden von einem Jar Archiv Netzwerkprogrammierung 4
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
S Dateien versenden Netzwerkprogrammierung 16
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
F IP "versenden" Netzwerkprogrammierung 6
N *.* Dateien versenden im Lan Netzwerkprogrammierung 5
H Versenden von Objekt Netzwerkprogrammierung 2
L JavaMail: Versenden von mails funktioniert nicht Netzwerkprogrammierung 7
P Array per Socketverbindung versenden Netzwerkprogrammierung 2
O Sms versenden Netzwerkprogrammierung 5
T Dateien wia P2P Connection versenden Netzwerkprogrammierung 2
S E-Mails versenden. Netzwerkprogrammierung 10
D Bits über UDP versenden Netzwerkprogrammierung 3
M generelle Frage zum Versenden Netzwerkprogrammierung 4
T Mit JavaMail API Faxe versenden? Netzwerkprogrammierung 5
K Files versenden Netzwerkprogrammierung 5
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
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
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
T Client zu Client Kommunikation Netzwerkprogrammierung 2
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
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben