Java IO Stream

cezary8468

Grünschnabel
Brauche Unterstützung bei der Erstellung eines Streams, der via Netzwerk Integer-Zahlen übergeben kann. Genau handelt es sich hier um das Java-Hamster-Modell.
Ein ClientHamster soll einem ServerHamster Koordinaten in Form von Integern übergeben, woraufhin der ServerHamster einen ServiHamster (also einen Thread) erstellt und diesem dannn die Koordinaten übergibt. Daraufhin läuft der ServiHamster zu der gewünschten Position mit Hilfe der Methode laufZurKachel().

Mir geht es schlicht darum, wie ich den korrekten (eventuell verschachtelten) Stream aufbaue, mit dem die Zahlen übergeben werden können.
Java:
this.senke = new DataOutputStream(socket.getOutputStream()); //als Ausgabe beim ClientHamster
this.quelle = new DataInputStream(socket.getInputStream()); // als Eingabe beim ServerHamster
Gruß und Dank im Voraus

Cezary
 
Zuletzt bearbeitet von einem Moderator:
Hi,

würde hier nicht mit Object-Streams arbeiten, sondern einfach ein UDP-Paket schicken. Für 2 (64 Bit) Integer brauchst du ja nur 16 Byte. Wenn du nur mit Koordinaten von 0 bis 255 arbeitest, dann reichen sogar 2 Byte.

Object-Streams sind recht aufwendig, vorallem die Fehlerbehandlung. Ein einfaches Beispiel findest du zum Beispiel hier.


Grüße,
BK
 
Hi Simon ;-)
bestimmt hast Du recht, was UDP anbetrifft, aber anhand dieser Hamstersimulation will/muß ich später ein komplettes CS-Sytem als paralleler Server entwickeln (also TCP) - so ist die Vorgabe meiner Einsendeaufgabe im (Fern-)Studium. Sogar das Beispiel im Buch, das alledings nur Strings versendet (mit Reader/Writer), arbeitet mit diesen Object-Streams.
Du kennst bestimmt das Buch "Parallele und verteilte Anwendungen in Java". Auf Seite 247 (in meiner Ausgabe) ist eine Abbildung der aus Input- und OutputStream abgeleiteten Klassen. Ich versuche, mich daran orientierend einen Strom zu basteln, der mir meine Koordinaten übeträgt.
Und es will einfach nicht fuktionieren...
 
Hi,

hab mir schon fast gedacht, dass die Aufgabenstellung so lautet ;)

Ok, wie sieht dein Ansatz bis jetzt aus? Konkret ist hier auf dem Server alles von dem socket.accept() bis zum socket.close() relevant. Auf der Client Seite analog der Verbindungsaufbau und das lesen der Integer Objects.

Grüße,
BK
 
Hi ;-)

ich sende Dir den Code sowohl aus dem Abschnitt, dedn Du bereits in der letzten Antwort erwähnt hast und dann noch die zwei Methoden ("Versenden" und "Empfangen"). Zusätzlich noch die main()-Funktionen, in denen diese Methoden dann aufgerufen werden.

Gruß Cezary

P.S. Ich sehe mich leider gezwungen, Dir den Quellcode hier direkt zu kopieren, weil die Datei .docx hier nicht geladen wird.
Wenn es nicht vollständig ankommt, müßte ich es direkt über private E-Mail-Adresse senden.
Java:
import java.io.*;
import java.net.*;

public class VersendeHamster extends AllroundHamster {

        protected DataOutputStream senke;  
    protected String host;
    protected int port;
    Zielposition zp = new Zielposition(4,5);
        
    protected VersendeHamster(Hamster hamster) {
        super(hamster);
        this.senke = null;
    }
        
    public void Versenden(){
    try{          
        if (this.senke != null) this.senke.writeInt(zp.getZielreihe());
        this.schreib("habe versendet " + (zp.getZielreihe()));
        // if (this.senke != null)this.senke.writeInt(s);
        // this.schreib("habe versendet "+s);
        // if (this.senke != null)this.senke.writeInt(k);
       }
        catch(Exception io){this.schreib("Fehler beim Schreiben");}; 
    }    
}
_____________________________________________________________________________________________________

import java.io.*;
import java.net.*;

public class SocketVersendeHamster extends VersendeHamster {
    
    public SocketVersendeHamster(Hamster hamster, String host, int port) {
        super(hamster); 
        try {
            Socket socket = new Socket(host, port);  //  Verbindungsanforderung            
            this.senke = new DataOutputStream(socket.getOutputStream());                             
            } catch (Exception exc) { this.senke = null;}//this.quelle = null;            
    }
}
______________________________________________________________________________________________________

void main() {
    SocketVersendeHamster cezary = new SocketVersendeHamster(Hamster
            .getStandardHamster(),"127.0.0.1",2345);              
         cezary.Versenden();   
}
_________________________________________________________________________________________________________

import java.io.*;

public class Zielposition implements Serializable{
 
      private volatile int Zielreihe;
      private volatile int Zielspalte;
      
      Zielposition(int r, int s){
         this.Zielreihe = r; 
         this.Zielspalte = s;
      }
      public void setZielreihe(int r){
         this.Zielreihe = r;}
      
      public void setZielspalte(int s){
         this.Zielspalte = s;}   
            
      public int getZielreihe(){
         return this.Zielreihe;
      }
      
      public int getZielspalte(){
         return this.Zielspalte;
      }           
}
____________________________________________________________________________________________________

import java.io.*;
import java.net.*;

 public class EmpfangsHamster extends AllroundHamster {
    protected int befehl;
        protected DataInputStream quelle;
    protected String host;
    protected int port,r,s;
      
    protected EmpfangsHamster(Hamster hamster) {
        super(hamster); 
        this.quelle = null;
        }        
   public void Empfangen(){                    
            try {              
                 int befehl = this.quelle.readInt();
                 this.schreib("habe nichts erhalten"+befehl);                                              
                 while (befehl != -1) {
                 this.schreib("habe erhalten " + befehl); }
                 this.quelle.close();                                    
                } 
          catch(Exception exc){};
          }      
}
_________________________________________________________________________________________________________

import java.io.*; 
import java.net.ServerSocket;
import java.net.Socket;
public class SocketEmpfangsHamster extends EmpfangsHamster {   
  public SocketEmpfangsHamster(Hamster hamster, int port) {
        super(hamster);                                                       
            try {
            ServerSocket serverSock = new ServerSocket(port);
            this.schreib("warte auf Verbindung..."); 
            while(true){                       
            Socket socket = serverSock.accept();
            this.schreib("Verbindung hergestellt"); 
            this.quelle = new DataInputStream(socket.getInputStream());
            }                                    
            } 
        catch (Exception exc) { this.quelle = null;}          
    }
}
_______________________________________________________________________________________________________

void main() {
    SocketEmpfangsHamster markus = new SocketEmpfangsHamster
    (Hamster.getStandardHamster(),2345);
    
    markus.Empfangen();
 }
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ok, das sieht bis jetzt OK aus. Gibts nen Fehler? Was passiert wenn du die beiden startest?
Du kannst übrigens in die Streams auch direkt ein Zielposition-Objekt schreiben, da dieses Serialzable ist. Somit musst du nicht 2 Integer übertragen, sondern nur ein Objekt.

Grüße,
BK
 
Hi,
Fehler gibt es syntaktisch keinen, weil die "Kompilierung erfolgreich" ist. Wenn ich die beiden starte, wird im Territorium des SendeHamsters ein Fenster angezeigt mit d. Text "habe versendet 4".
Dagegen im Territorium des EmpfangsHamsters erscheint nichts mehr danach. Das heißt für mich eigentlich, dass nichts übertragen wurde. Auch die Sache mit dem Zielposition-Objekt habe ich schon probiert - ebenfalls ohne Erfolg. Da ich den Beispielcode aus dem Buch schon mehrmals verglichen habe, vermute ich dort keinen Fehler. Ursprünlich werden in der Beispielaufgabe Strings übertragen mit dem Printer und Writer und das hat auch einwandfrei funktioniert. Bei der Übertragung der Zahlen durch eine andere Streamart war dann Schluß. Und seitdem stecke ich sozusagen fest.

Gruß Cezary

P.S. Den Hamstersimulator kannst Du übrigens kostenlos herunterladen.
http://www.java-hamster-modell.de
 
Hi,

in der EmpfangsHamster:Empfangen(), im obigen Teil Zeilen 94 - 98.
Das kann so nicht funktionieren, schau dir das nochmal genau an. Du hast da eine Endlosschleife.

Genauso im Konstruktor von SocketEmpfangsHamster, Zeilen 113 - 117. Somit hängt er beim Empfangen in der main in Zeile 125, das markus.Empfangen(); wird nicht aufgerufen.

Grüße,
BK
 
Hi,
danke Dir für eine sehr konkrete Kritik/Korrektur. Genau das habe ich auch gebraucht, weil ich schon nicht mehr wußte, wo ich den Fehler suchen soll. Daß der Fehler an "meiner" Implemenatation lag, mußte ich verdächtigerweise schon mal annehmen, obwohl ich den Sourcecode eigentlch vollständig dem besagten Buch entnommen habe. Wie gesagt, er hat ja auch in seiner ursprünglichen Version einwandfrei funktioniert; die Probleme begannen erst nach der Umstellung auf die Versendung von Integers. Ich schau' mir das Ganze nachher sehr genau an. Ich melde mich auf jeden Fall mit einem Feedback.

Gruß Cezary
 
Hi,
wie versprochen, melde ich mich mit einem Feedback. Es hat tatsächlich an der "while"-Schleife im SocketEmpfangsHamster gelegen. Wie ich alledings dazu gekommen bin, diese zu implementieren, weiß ich heute nicht mehr. Weiß Gott, wie lange ich noch gesucht hätte - in solchen Fällen sieht man den Wald vor lauter Bäume nicht mehr. Auch die Bedingung der "while"-Schleife im EmpfangsHamster habe ich auf '0' geändert, denn 'null' galt ja nur bei der Stringübertragung. Muß natürlich noch DEN Fall in Betracht ziehen, wenn die Koordinaten, die zu übertragen sind, eine '0' enthalten, denn dann wäre
Code:
while(befehl != 0)
nicht wirklich angebracht.
Ich danke Dir jedenfalls vielmals für die Hilfe und vielleicht...bis bald ;-)

Gruß Cezary
 
Zurück