Objekte per TCP verschicken + Thread

Hallo,

ich habe folgendes Problem.

Ich besitze einen TCP Clienten und einen TCP Server.

Der TCP Server verschickt an meinen Clienten mittels

[TCP Server]
Java:
ObjectOutputStream oos = new ObjectOutputStream(sverb.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(sverb.getInputStream());

        mr = new MonitorBean();

        oos.writeObject(mr.getTraffic(user, pass));
        oos.writeObject(mr.getMaxTraffic(user, pass));
        oos.writeObject(mr.getIPs(user, pass));

Objekte an meinen Clienten.

Diese empfängt mein Client durch

[TCP Client]
Java:
public void getObjectStreams() throws IOException, ClassNotFoundException {
        oos = new ObjectOutputStream(clientSocket.getOutputStream());
        ois = new ObjectInputStream(clientSocket.getInputStream());

        Traf = (Integer) ois.readObject();
        MT = (ArrayList<String>) ois.readObject();              // erstellt wurden
        IP = (ArrayList<String[]>) ois.readObject();

    }

Netbeans regt sich zwar ein bisschen darüber auf mit z.B.,

[XML]TCPClient.java:59: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.ArrayList<java.lang.String[]>
IP = (ArrayList<String[]>) ois.readObject();[/XML]

aber es funktioniert auch auf diese Art und Weise.


Ich würde das empfangen beim Clienten, also das getObjectStreams gerne im run() eines Threads erledigen.

Aussehen in meinem TCPClienten würde es dann so:

[TCP Client im "Thread Stil"]
Java:
 public void getObjectStreams() throws IOException, ClassNotFoundException {
        oos = new ObjectOutputStream(clientSocket.getOutputStream());
        ois = new ObjectInputStream(clientSocket.getInputStream());

        new Thread(new Runnable() {

            public void run() {
                try {
                    Traffic = (Integer) ois.readObject();
                    MaxTraffic = (ArrayList<String>) ois.readObject();              // erstellt wurden
                    IP = (ArrayList<String[]>) ois.readObject();
                    
                } catch (IOException ex) {  
                    System.out.println("Fehler aufgetreten");
                 Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }).start();
    }

Das ärgerliche ist, es tritt immer eine Exception auf "Fehler aufgetreten".

Java:
TCPClient$1 run
SCHWERWIEGEND: null
java.net.SocketException: Socket closed
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:146)
        at java.net.SocketInputStream.read(SocketInputStream.java:199)
        at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2265)
        at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2558)
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2568)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
        at de.genias.mikrotik.verbindungscenter.TCPClient$1.run(TCPClient.java:71)
        at java.lang.Thread.run(Thread.java:636)

und die Daten werden vom Server nicht versandt. Das Programm läuft zwar weiter (Client und Server), aber ohne empfangenen Daten.

Woran liegt mein Problem?

Ist mein gecaste die Ursache? Komme leider nicht weiter.

Würde mich über Hilfe sehr freuen.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Vermutlich beendest du die Verbindung wärend der Thread läuft.
P.S. einfache Zahlen mit ObjektStreams verschicken... hmm....
 
S

SlaterB

Gast
da sind ja ne Menge Methoden, wer ruft denn wann wen wo warum auf, was gehört zu Sender, was zu Empfänger usw.,

wenn eine Methode wie
> public void getObjectStreams()
mit ihren neu erstellten Streams und der kurze Thread darin beendet sind,
dann muss man damit rechnen, dass die enthaltenen Streams beendet werden und dies ein close() der Socket-Streams bewirkt,

> new ObjectOutputStream(clientSocket.getOutputStream());
sollte genau einmal recht in der Nähe von clientSocket zentral definiert und solange offen gehalten wie der Socket auch offen ist

was das für Probleme beim Senden mit sich bringt ist eine andere Frage,
vielleicht wird nicht gesendet bevor nicht flush()/ close() aufgerufen wird
 
Schonmal vielen Dank.

Habe im Moment leider keinen Zugriff aufs Programm, aber nur nochmal für das Verständnis.

Die Reihenfolge der Ausführung:

Schritt:
1. oos.writeObject(mr.getTraffic(user, pass)); // Server schickt
2. Traf = (Integer) ois.readObject(); // Client empfängt

3. oos.writeObject(mr.getMaxTraffic(user, pass)); // Server schickt
4. MT = (ArrayList<String>) ois.readObject(); // Client empfängt

5. oos.writeObject(mr.getIPs(user, pass)); // Server schickt
6. IP = (ArrayList<String[]>) ois.readObject(); // Client empfängt


Analog der Code mit dem Thread.

Also der Server beendet die Verbindung denke ich nicht. Ich kann nämlich wie gesagt, weiterhin mit dem laufenden Programm arbeiten und andere Abfragen machen, die mir der Server sauber beantwortet.
 
S

SlaterB

Gast
> der Server beendet die Verbindung denke ich nicht [..] andere Abfragen machen, die mir der Server sauber beantwortet

steht im direkten Widerspruch zur Socket closed-Exception und überhaupt deiner Frage,
es sei denn du hast das berücksichtigt und möchtest ausdrücken dass irgendwie in eine Richttung geschlossen ist und in die andere nicht?
dann solltest du wirklich alles ganz exakt erzählen,
bei deinen Schritten 1-6 ist weder eine Gegenrichtung noch eine auftretende Exception zu sehen und auch nicht wer wo wann Methoden aufruft, die wie gesagt Streams schließen können,

ideal wären eigentlich ein-zwei komplette Programme, vielleicht sogar auf localhost-Socket und damit allgemein überall ausführbar,
oder ein interessantes Log, z.B.


1. oos.writeObject(mr.getTraffic(user, pass)); // Server schickt
2. Traf = (Integer) ois.readObject(); // Client empfängt

3. oos.writeObject(mr.getMaxTraffic(user, pass)); // Server schickt
4. MT = (ArrayList<String>) ois.readObject(); // Client empfängt

5. oos.writeObject(mr.getIPs(user, pass)); // Server schickt
6. IP = (ArrayList<String[]>) ois.readObject(); // Client empfängt

7. Server beendet Methode getObjectStreams()
8. Server schickt noch was, Client bekommt Exception
9. Client schickt noch was, Sender kann das empfangen

edit:
nochmal genauer dein erstes Posting gelesen:
da steht ja dass es mal geht und mal nicht mehr, na nun bin ich ganz aufgeschmissen worum es dir eigentlich geht,
beim Übergang von Methode zu Thread besteht hier wohl ein wesentlicher Unterschied: der Thread wird erst später ausgeführt, bis dahin ist die Original-Methode fertig und danach wird irgendwo der Socket geschlossen,
deswegen nützen dem Thread die erstellten Streams nicht mehr, die wurden hinterrücks abgeschaltet
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Socket Über UDP Objekte verschicken Netzwerkprogrammierung 9
P Serialialiserte Objekte übers Netzwerk verschicken Netzwerkprogrammierung 9
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
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
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
B Eigene Objekte per RMI übergeben Netzwerkprogrammierung 2
S Kapselung der Netz-Objekte Netzwerkprogrammierung 3
B verschiedene Serialisierte Objekte identifizieren? Netzwerkprogrammierung 5
T Objekte im NIO unblocking mode versenden Netzwerkprogrammierung 11
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
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
A Konflikt: Blocking und Non-Blocking bei Objekte versenden Netzwerkprogrammierung 4
N RMI und Datenbank Objekte Netzwerkprogrammierung 3
P Objekte über DatagramSocket versenden Netzwerkprogrammierung 12
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
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
B SocketChannel ByteBuffer Bilder verschicken Netzwerkprogrammierung 17
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
F Fragen zu Netzwerkspiel, ArrayList verschicken Netzwerkprogrammierung 5
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
M Socket Verschicken von Objecten außerhalb des Routers Netzwerkprogrammierung 29
G Verschlüsselte Strings über Netzwerk verschicken Netzwerkprogrammierung 19
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
P Massen emails verschicken an Kunden die in Datenbank sind Netzwerkprogrammierung 4
T Daten über GSM verschicken Netzwerkprogrammierung 4
S Knuddels Chat System: Bot / Nachrichten verschicken? Netzwerkprogrammierung 6
O email verschicken Netzwerkprogrammierung 8
8 ByteArray per Netzwerk verschicken Netzwerkprogrammierung 6
B Eigenes Protokoll über Sockets verschicken Netzwerkprogrammierung 4
D .jpg, .wav per ServerClient Verbindungen verschicken Netzwerkprogrammierung 8
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
A FileSend - Dateien verschicken Netzwerkprogrammierung 19
B Nachrichten über das Netzwerk verschicken Netzwerkprogrammierung 3
OnDemand Thread und Ratelimiter Netzwerkprogrammierung 4
F Thread "extern" beenden Netzwerkprogrammierung 3
OnDemand Linux RAM per Thread Netzwerkprogrammierung 3
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
C Thread Netzwerkprogrammierung 9
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
S Socket ThreadPool oder Thread pro Client? Netzwerkprogrammierung 11
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
M Thread Scheduler Java 5.0? Netzwerkprogrammierung 2
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
B Socket Thread handling / Reader init Netzwerkprogrammierung 8
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Thread Pooling Netzwerkprogrammierung 6
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
B callback thread udp Netzwerkprogrammierung 2
D RMI und Thread Netzwerkprogrammierung 4
S Kommunikationsproblem, Thread und manuel Netzwerkprogrammierung 4
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
K ein Thread pro Stream Netzwerkprogrammierung 2
D Weiterer Thread auf Port 843 horcht Netzwerkprogrammierung 7
D Thread problem Netzwerkprogrammierung 3
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Thread Transport Netzwerkprogrammierung 6
S Socket Thread in Schleife Netzwerkprogrammierung 4
T synchronized mit thread und rückgabe Netzwerkprogrammierung 4
Q Thread und Sockets... Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
PAX Outputstream von anderem Thread verwenden lassen Netzwerkprogrammierung 5
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
E java.lang.NullPointerException aber nur wenns im Thread läuf Netzwerkprogrammierung 4
F EIN Thread in RMI auf Serverseite Netzwerkprogrammierung 3
G Server Thread beenden Netzwerkprogrammierung 16
T Socket-Thread: Designfrage Netzwerkprogrammierung 14
S Mit Thread arbeitende Maschine Netzwerkprogrammierung 6
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
K Selbe Streams mehrfach nutzen (zusätl. Thread) Netzwerkprogrammierung 6
ven000m Thread Frage Netzwerkprogrammierung 11
B Thread.start() (run()) excption Netzwerkprogrammierung 2
M Thread läuft nicht weiter Netzwerkprogrammierung 2
B NullPointerException | Thread Netzwerkprogrammierung 4
U Current thread not owner Netzwerkprogrammierung 3
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
S Webserverprogrammierung: Thread-Beschränkung Netzwerkprogrammierung 2
M Exception in thread "main" java.lang.NoClassDefFou Netzwerkprogrammierung 2
F problem mit thread bzw. netzwerkverbindung! Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben