Kollision von ObjectInputStream und BufferedReader ?

Status
Nicht offen für weitere Antworten.

cyalater

Mitglied
Hi!

Habe ein Programm geschrieben, dass bereits in der Lage ist, Chatnachrichten über Netzwerk zu senden und zu empfangen. Da das Programm auch Files übers Netz senden soll, will/muss ich zusätzlich Informationen über die zur Verfügung stehenden Dateien austauschen.
Wie im Chat lausche ich also nun auf Objekte, die Informationen mit sich bringen. Der Unterschied ist:

Code:
       sockin = new BufferedReader(new InputStreamReader(client.getInputStream()));
                while(true){
                    String text = sockin.readLine();
                    gui.setChatText(text);
                }

Code:
       ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
                while(true){
                    Object o = ois.readObject();
                    Participant p = (Participant) o;
                    gui.getController().addParticipant(p.getName(), p);
                    gui.updateParticipants();
                    InfosOutgoing io = new InfosOutgoing(comserver,gui);
                    io.start();

wenn ich also die Threads starte
ChatIncome ci = new ChatIncome(this,gui);
ci.start();
InfosIncome ii = new InfosIncome(this,gui);
ii.start();


bekomme ich beim Server folgende Fehlermeldung:
java.io.StreamCorruptedException: invalid stream header
at java.io_ObjectInputStream.readStreamHeader(Unknown Source)
at java.io_ObjectInputStream.<init>(Unknown Source)
at control.InfosIncome.run(InfosIncome.java:35) <<Zeile 35 ist übrigens das ObjectInputStream Objekt.>>
Weiterhin gibt er auf die Gui seltsame kryptische Zeichen aus, keine Ahnung warum.

Wenn ich den ChatIncome Thread nicht starte, funktioniert der Informationenaustausch problemlos! Allerdings kann ich dann nicht mehr chatten :)

Kann mir das einer erklären? bin ratlos. Vielen Dank.
 

The_S

Top Contributor
Ich schätze mal, dass wirst du knicken können zwei Streams auf einen Socket lesen/schreiben zu lassen. Und selbst wenn es funktionieren würde, wäre das eine äußerst ungüngstige Idee, weil vermutlich "lauschen" ja beide ständig ob was reinkommt. Und mal angenommen, dass einmal bei einem eingehenden Objet der BufferedReader schneller als der ObjectInputStream ist, weil dieser z. B. grad noch was anderes zu tun hat. Was machste dann?

Also: zwei Sockets verwenden!
 

cyalater

Mitglied
ch schätze mal, dass wirst du knicken können

Da haste wohl recht, der eine Thread funzte immer, der andere war zwar aktiv, war es aber irg. doch nicht...
Prinzip ist klar.
"Problem:" Ich brauche halt für jeden neuen Server einen verschiedenen Port. Nehme ich denselben gibts immer die Fehlermeldung, dass die Adresse halt gleich ist (klar :) Kann man das nicht irg. über nur über einen Port laufen lassen?

danke einstweilen mal!
 

The_S

Top Contributor
Du kannst alles über einen Port laufen lassen, kannst dann aber auch nur einen Reader/Writer verwenden.

Aber zwei Ports sollten ja genügen, einen fürn Datentransfer und einen für Text/Systemnachrichten/Befehle/... (halt alles was auch als Text versendet werden kann).

Schreibe zZ. auch an etwas, für was ich sowas benötige. Für den Server hab ich drei Klassen, eine für die Informationen, eine für Text, eine für Daten. Macht 3 Ports. Mehr braucht man ja eigentlich so gut wie nie oder?
 

cyalater

Mitglied
Deine Tipps haben gut funktioniert. Danke. Musste leider alles umstellen.
Also ich brauche halt 3 Port, da ich evtl. mehrere Teilnehmer als Klienten haben will. Also brauche ich jeweils einen für Chat, Daten und Dateien. Mh.. für den Server habe ich nur eine Klasse, weiß nicht, ob das so die eleganteste Lösung ist, aber auf jeden Fall habe ich so gut wie keinen doppelten Quelltext.
Falls du mal einen Blick reinwerfen willst ("DateiServer" ist noch nicht fertig, daher nur 2...)
Code:
package control;

import [...]

public class Services extends Thread{
    
    private Gui gui;
    private String choice="";
    private ServerSocket server;
    private Socket client;
    private PrintWriter sockout;
    private BufferedReader sockin;
    
    public Services(Gui gui, String choice){
        this.gui=gui;
        this.choice=choice;
    }
    
    public synchronized void run(){
        
        try {
            InetAddress addr = InetAddress.getLocalHost();
            if(choice=="info"){
                server = new ServerSocket(gui.getController().getPort());
            }else if(choice=="chat"){
                server = new ServerSocket(gui.getController().getPort()+1);
                
            }
            gui.setChatText("Server auf " +
                    addr.getHostName() + "/" +
                    addr.getHostAddress() + ":" +server.getLocalPort() +" gestartet ...");
            //zur Zeit nur 1 Client...
            client = server.accept();
            InetAddress clientAddr = client.getInetAddress();
            int clientPort = client.getPort();
            gui.setChatText(choice+" Verbindung Chat zu " +clientAddr.getHostAddress() +
                    ":" + clientPort +" aufgebaut");
            
            //decide between chat and infos
            if(choice=="info"){
                ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
                while(true){
                    Object o = ois.readObject();
                    Participant p = (Participant) o;
                    gui.getController().addParticipant(p.getName(), p);
                    gui.updateParticipants();
                }
            }else if(choice=="chat"){
                sockin = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
                sockout = new PrintWriter(client.getOutputStream(),true);
                while(true){
                    String text = sockin.readLine();
                    gui.setChatText(text);
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void sendText(String text){
        sockout.println(gui.getController().getUser().getName()+": "+text);
        gui.setChatText(gui.getController().getUser().getName()+": "+text);
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
G ObjectOutputStream und ObjectInputStream machen Ärger Netzwerkprogrammierung 17
F ObjectInputStream.readObject() mehrfach aufrufen Netzwerkprogrammierung 2
J ObjectInputStream im Netzwerk Netzwerkprogrammierung 8
K ObjectInputStream EOF Netzwerkprogrammierung 6
G ObjectInputStream hängt ganzes Programm auf... Netzwerkprogrammierung 7
X ObjectInputStream StringCorruptedException Netzwerkprogrammierung 3
V StreamCorruptedException bei ObjectInputStream und ObjectOStream Netzwerkprogrammierung 5
S FileInputStream und ObjectInputStream Netzwerkprogrammierung 18
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
J Socket ObjectInputStream prüfen Netzwerkprogrammierung 8
N Socket neue Referenz auf ObjectInputStream Netzwerkprogrammierung 13
E Rausfinden ob noch Objecte in ObjectInputStream Netzwerkprogrammierung 5
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
K ObjectInputStream mit CypherInputStream hängt Netzwerkprogrammierung 7
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
R ObjectOutput- / ObjectInputStream Exception? Netzwerkprogrammierung 2
E ObjectInputStream/ObjectOutputStream nicht erzeugbar Netzwerkprogrammierung 2
T Problem mit ObjectInputStream Netzwerkprogrammierung 2
G ObjectInputStream gebuffert? Netzwerkprogrammierung 3
M HTTP URLConnection + BufferedReader killt meine Umlaute Netzwerkprogrammierung 4
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
C Socket BufferedReader.read(char[] buffer) blockiert unregelmäßig Netzwerkprogrammierung 3
J BufferedReader.ready() wird nicht true Netzwerkprogrammierung 10
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
V Socket BufferedReader interrupten? Netzwerkprogrammierung 10
B Multi-Threaded block bei BufferedReader.readLine() Netzwerkprogrammierung 8
S BufferedReader blockiert zu lange Netzwerkprogrammierung 4
P eine BufferedReader für alles ankommende Netzwerkprogrammierung 2
C 2 BufferedReader als Listener pro Socket (NICHT) möglich? Netzwerkprogrammierung 2
E BufferedReader.ready() immer false Netzwerkprogrammierung 8
R Mittels BufferedReader Objekte lesen? Netzwerkprogrammierung 5
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
O BufferedReader.readline kommt nicht zurück Netzwerkprogrammierung 7
F BufferedReader Socket Netzwerkprogrammierung 2
B BufferedReader.readLine() ließt nicht vollständig ! ? Netzwerkprogrammierung 5
J Vom BufferedReader lesen -> hängt ohne Fehler,ohne Except Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben