# Kollision von ObjectInputStream und BufferedReader ?



## cyalater (2. Apr 2006)

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:


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


```
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.ibjectInputStream.readStreamHeader(Unknown Source)
	at java.ibjectInputStream.<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 (3. Apr 2006)

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 (3. Apr 2006)

_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 (3. Apr 2006)

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 (3. Apr 2006)

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...)

```
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);
    }
}
```


----------



## cyalater (4. Apr 2006)

-topic closed-

wo kann man das denn mit Häkchen versehen *grmbl


----------



## Roar (4. Apr 2006)

http://www.java-forum.org/de/viewtopic.php?t=17407
http://www.fielmann.de/ ???:L :lol:


----------

