TCP multiClientServer mit socket mittels ObjectOutputStream

alex_Coding

Mitglied
Hallo zusammen,

ich Rahmen eines Praktikums im Studium war die Aufgabe Objecte über einen Socket zu verschicken.Dies sollte mitteln eines multiClientServer geschehen. Das Verschicken der Objekte muss zwingend über einen ObjectOutputStream realisiert .Derzeitig werden nur String Objekte verschickt, zum Testen...

Unten befinden sich 3 Klassen: Server, ClientHandler, und der Client. Um leichter einen Einstieg zu finden, habe ich den Code eingefügt.

Ich starte also die Main Methode der Server Klassen und im Anschluss führe ich die Main des Client aus.

An der Stelle
System.out.println("bis hier und nicht weiter"); innerhalb des ClientHandler.class ist dann irgendwie Schluss. Dies wird noch ausgegeben.

Aber der Thread wird nicht gestartet, also glaube ich zumindestens, auf jeden Fall wird der print Befehl innerhalb des Construktors von CLientHandler nicht ausgegeben.


Ich habe die Dateien zudem in den Anhang gepackt.

Vielen Dank im voraus, ich bin überfrage




Java:
package tcp_final;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//Java implementation of  Server side 
//It contains two classes : Server and ClientHandler 
//Save file as Server.java 



//Server class 
public class Server  
{ 
 public static void main(String[] args) throws IOException  
 { 
     // server is listening on port 5056 
   
    ServerSocket ss = new ServerSocket(8080); 
    System.out.println("Server gestartet auf Socket: "+ ss.getLocalPort());  
     // running infinite loop for getting 
     // client request 
     while (true)  
     { 
         Socket s = null; 
         
         try 
         {     
             
             // socket object to receive incoming client requests 
             s = ss.accept(); 
               
             System.out.println("bis hier und nicht weiter");
             ObjectInputStream dis = new ObjectInputStream(s.getInputStream()); 
             ObjectOutputStream dos = new ObjectOutputStream(s.getOutputStream()); 
               
             System.out.println("Assigning new thread for this client"); 
             

             Thread t = new ClientHandler(s, dis, dos); 
             t.start(); 
               
         } 
         catch (Exception e){ 
             s.close(); 
             ss.close();
             e.printStackTrace(); 
         } 
     } 
 } 
}



Java:
package tcp_final;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

//ClientHandler class 
class ClientHandler extends Thread  
{ 

 final ObjectInputStream dis; 
 final ObjectOutputStream dos; 
 final Socket s; 


 // Constructor 
 public ClientHandler(Socket s, ObjectInputStream dis, ObjectOutputStream dos)  
 { 
     System.out.println("Run ClientHandler Constructor");
     this.s = s; 
     this.dis = dis; 
     this.dos = dos; 
 } 

 @Override
 public void run()  
 { 
     System.out.println("Thread Run Methode");
     String received; 
  
     while (true)  
     { 
         try { 
             
                
             received = (String) dis.readObject(); 
             System.out.println("Vom Server gesendet: "+ received);
             
             if(received.equals("Exit")) 
             {  
                 System.out.println("Client " + this.s + " sends exit..."); 
                 System.out.println("Closing this connection."); 
                 this.s.close(); 
                 System.out.println("Connection closed"); 
                 break; 
             } 
                 
             ///send to server
             dos.writeObject("Irgendeine Nachricht");
             
                 
         } catch (IOException e) { 
             e.printStackTrace(); 
         } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
     } 
     try
     { 
         // closing resources 
         this.dis.close(); 
         this.dos.close(); 
           
     }catch(IOException e){ 
         e.printStackTrace(); 
     } 

 } 
}



Java:
package tcp_final;
import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

//Client class 
public class Client  
{ 
 public static void main(String[] args) throws IOException  
 { 
     try
     { 
         Scanner scn = new Scanner(System.in); 
           
         // getting localhost ip 
         InetAddress ip = InetAddress.getByName("localhost"); 
         Socket s = new Socket(ip, 8080); 
   
         ObjectInputStream dis = new ObjectInputStream(s.getInputStream()); 
         ObjectOutputStream dos = new ObjectOutputStream(s.getOutputStream()); 
         
         // the following loop performs the exchange of 
         // information between client and client handler 
         while (true)  
         {    
             System.out.println("Client While"); 
             
             String tosend = "Nachricht an den Server";
             dos.writeObject(tosend);
             
             if(tosend.equals("Exit")) 
             { 
                 s.close(); 
                 break; 
             } 
 
             /// Antwort from Server
             String received =  (String) dis.readObject(); 
             System.out.println(received); 
             
         } 
           
         // closing resources 
         scn.close(); 
         dis.close(); 
         dos.close(); 
     }catch(Exception e){ 
         e.printStackTrace(); 
     } 
 } 
}
 

Anhänge

  • programm.zip
    2 KB · Aufrufe: 1
Zuletzt bearbeitet von einem Moderator:

LimDul

Top Contributor
Das dürfte die Ursache sein:

Creates an ObjectInputStream that reads from the specified InputStream. A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header.

Das erzeugen eines ObjectInputStreams ist eine Blocking-Operation. Der Server muss mindestens sofort den Serialization Header schicken (wie auch immer man das macht, da bin ich raus)
 

LimDul

Top Contributor
Nachtrag: Versuch mal die ObjectOutputStreams zuerst zu erzeugen.

Dadurch das du sowohl auf Client als auch auf Server Seite die InputStreams zuerst erzeugt, warten sowohl Client als auch Server, dass der korrekte Header geschickt wird - was nie passieren wird, da keiner der beiden den ObjectOutputStream erzeugen kann.
 
K

kneitzel

Gast
Eine Idee wäre, dass man sofort nach der Verbindung jeweils ein Objekt schickt. Das kann z.B. ein leerer String sein oder einfach eine Object Instanz.

Mit dem Schreiben des ersten Objekts wird natürlich auch der Header geschrieben und die blocking Operation geht weiter. Das bedeutet, dass er zwar immer noch blockiert, aber halt nur, bis das erste Objekt angekommen ist ...

Wichtig ist aber auch, dass man die Erstellung auf Client / Server in unterschiedlicher Reihenfolge macht. Wenn sowohl Server als auch Client zuerst den InputStream öffnen, warten beide auf ein erster Objekt. Also sollte man da ggf. so hingehen, das immer erst der OutputStream erstellt wird und ein erstes Objekt gesendet wird (um den Header abgearbeitet zu haben).
 
K

kneitzel

Gast
Noch eine kleine Korrektur bezüglich meiner Antwort:
Es scheint so, als ob der Header direkt geschrieben wird und nicht beim ersten Objekt, das gesendet wurde.

Daher ist dieses erste Objekt nicht notwendig, sondern es sollte ausreichen, die ObjectOutputStreams zuerst zu erstellen. So deute ich zumindest meinen Test, der einfach nur einen ObjectOutputStream erzeugt und sofort wieder schließt.
 

alex_Coding

Mitglied
hi,
vielen Dank für die schnellen Antworten...

Ich frage mich wie ich denn einfach einen ObjectOutputStream erzeuge, mit ObjectOutputStream oos= new ObjectOutputStream()
Hier kriege ich immer das Problem, dass ich Problem mit dem Konstruktor.

ObjectInputStream dis = new ObjectInputStream(s.getInputStream());
ObjectOutputStream dos = new ObjectOutputStream(s.getOutputStream());

Ich muss ja irgendwie auch den socket beim Erstellen des ObjectOutputStream mitgeben.
Wie hast du dir das denn gedacht bzw realisiert?

Danke nochmal
 
K

kneitzel

Gast
Einfach die beiden Zeilen sowohl im Client als auch im Server vertauschen:

ObjectInputStream dis = new ObjectInputStream(s.getInputStream());
ObjectOutputStream dos = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream dis = new ObjectInputStream(s.getInputStream());
 

LimDul

Top Contributor
Das bestärkt mich übrigens in meiner Ansicht, dass Serialisierung und ObjectInput/OutputStreams evil sind. Das ein XXInputStream-Konstruktor, der nur einen anderen InputStream als Eingabe bekommt eine Blocking-Operation ist - das finde ich definitiv nicht intuitiv. Es ist zwar im JavaDoc dokumentiert, aber ich hab da nur geschaut, weil das anhand der Beschreibung und des Codes die einzige Stelle sein konnte, die blockiert. Aber da wäre ich ohne Dokumentation nie drauf gekommen.
 
K

kneitzel

Gast
Also erst einmal schön, dass jetzt alles klappt.

Und ja, ich gebe Dir voll und ganz Recht @LimDul. Aber das erinnert mich an eine Diskussion mit dem allwissenden Junior Developer oder Wissenschaftler oder was auch immer, der darin DIE Lösung sah. Alles Andere ist Müll :)

@alex_Coding Aber unabhängig von der Einschätzung, ist es hier natürlich explizit gefordert und zum Anderen ist das natürlich relativ trivial aufzubauen, so es nur um kurze Übungen geht.

Und was mir bei diesem Beispiel in den Sinn kommt: Ist die serialVersionUID von String (und anderen Framework Klassen) gleich über Versionen, Anbieter und Betriebssysteme? Also Oracle JDK vs. Zulu vs. AdoptOpenJDK, ... über dieverse Versionen (8,9, ..., 14) und OS (Windows 32/64 Bit, Linux, Mac, AIX, ...)... Muss ich das erst testen oder weiss das jemand durch Zufall?
 

fhoffmann

Top Contributor
Ist die serialVersionUID von String (und anderen Framework Klassen) gleich über Versionen, Anbieter und Betriebssysteme?
Zumindestens in Code der Klasse String (von unterschiedlichen Versionen) habe ich folgenden Text gefunden
Java:
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
Wäre ja auch ziemlich blöd, wenn man Strings nicht seialisieren könnte.
 
K

kneitzel

Gast
Danke für die Antwort.

Ich habe es auch eben einmal etwas getestet und auf dem Windows PC (Zulu Java 8, Adopt OpenJDK 11) sowie auf AIX (IBMs Java 8) kam immer genau diese Zahl...

Und ist auch tatsächlich logisch, denn man selbst legt bei sich ja auch die serialVersionUID fest und das würde ja nichts bringen, wenn die eigentlichen Klassen, auf denen man aufbaut, nicht auch feste Versionen hat. Also auch mit etwas Nachdenken war das eigentlich logisch ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
G Socket Socket Kommunikation Netzwerkprogrammierung 1
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
E Socket Frage Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
T Socket Socket connections schließen? Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
F Socket Socket in anderen Methoden Netzwerkprogrammierung 1
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
I Socket Netzwerkprogrammierung 1
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
Joew0815 socket event handler Netzwerkprogrammierung 2
F Einfache Socket Verbindung Netzwerkprogrammierung 2
A Socket Socket Receive-/SendBuffersize Netzwerkprogrammierung 0
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
B SSL Socket Netzwerkprogrammierung 2
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
S Socket SSL Socket und Sun/Oracle Java Netzwerkprogrammierung 5
S Socket Socket Verbindung wiederherstellen Netzwerkprogrammierung 16
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
C Socket Systemsperren mit Socket Netzwerkprogrammierung 4
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
A UDP verlorene Pakete/ socket.receive zu langsam Netzwerkprogrammierung 27
CookieSoft Socket Packet per Socket Netzwerkprogrammierung 8
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Per Socket auf POP3 zugreifen? Netzwerkprogrammierung 7
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T Socket String zu Socket Netzwerkprogrammierung 26
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
C Socket Socket: Connection timed out Netzwerkprogrammierung 3
T Socket blockierter Socket Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
T Alternative Socket mit Verbindungsabbruch Erkennung Netzwerkprogrammierung 2
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
D RMI oder Socket Netzwerkprogrammierung 4
H Socket Socket listening Netzwerkprogrammierung 11
D Client Socket mit Eventlistener? Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Netzwerkprogrammierung 18
N Socket geht auf Windows, aber auf Mac nicht ? Netzwerkprogrammierung 3
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
G Exception: Connection reset by peer: socket write error Netzwerkprogrammierung 2
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
J Socket Socket Programmierung. Wie anfangen? Netzwerkprogrammierung 4
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
Dit_ FTP Download | "PassiveMode"-Socket öffnen Netzwerkprogrammierung 4
A Socket Socket Verbindung unterbrochen --> keine Exception Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben