Klassenübergreifendes Objekt Attribut

Hallo miteinander,

Das sind meine 3 Klassen.

Java:
import java.io.IOException;


public class Auto {
public String text = "hallo 1";

public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}


	public static void main(String[] args) throws InterruptedException, IOException {
		
		Auto a = new Auto();
		System.out.println(a.text);
	}

	
}

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

	Auto a = new Auto();
	
	
	public static void main(String[] args) {
		try {
			
			ServerSocket server = new ServerSocket(5555);//Serversocket für Server
			System.out.println("Server gestartet!");
			
			Socket client = server.accept();//Client erzeugen wenn verbindung besteht
			
			//Streams
			
			//Daten zum Client; writer "sendet"
			OutputStream out = client.getOutputStream();
			PrintWriter writer = new PrintWriter(out);
			
			//Daten vom Client; Buffer "empfängt"
			InputStream in = client.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			//---------------------------------------------------
			
			String text = null;
			
			while((text = reader.readLine()) != null){ //liest Zeile aus
				System.out.println("Empfangen vom Client:" + text);
				
			}
			a.setText(text);
			writer.close();
			reader.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 

	}

}

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

	
	
	public static void main(String[] args) {
		
		try {
			
			Socket client = new Socket("localhost",5555);
			System.out.println("Client gestarted");
			
			//Streams
			
			//Daten zum Server; writer "sendet"
			OutputStream out = client.getOutputStream();
			PrintWriter writer = new PrintWriter(out);
			
			//Daten vom Server; Buffer "empfängt"
			InputStream in = client.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			//---------------------------------------------------
			
			writer.write("Hallo Server!");
			writer.flush();//stream wird aktualisiert
			
			reader.close(); 
			writer.close();//beim schließen wird eigentlich der Stream gesendet
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Kurzzusammenfassung (was versuche ich):
1.Nur ein Objekt von Auto von Auto darf bestehen.
2. Client sendet einen String zum Server.
3. Dieser String soll in das Objekt a sowie dessen Attribut text, geschrieben und ausgedruckt werden.
4. Wenn der String des Clients sich ändert soll auch das Attribut text sich ändern. (Im Grunde genommen ein dynamisches Attribut.

Dafür müsste der Server auch wahrscheinlich 24/7 laufen. Nur soweit bin ich noch nicht, weiß auch nicht wie ich das machen soll.

Kann mir jemand sagen wie ich korrekt in "text" schreiben kann über die klasse server? 🙂

Ich hatte in letzter zeit mehr mit C zu tun. Ich hab von Java ihrgenwie kein peil mehr 🙁
und server und client ist auch für mich neu.
 
du machst ja nur einmal "new Auto" also besteht auch immer nur ein Auto.


Falls du echt nur ein Auto hast, kannst du ja deinem Auto die Sachen reinstopfen, die der Client sendet
Du kannst dein Auto auch serialisieren, und deserealisieren, damit es nach einem Neustart noch vorhanden ist

Alternativ, und wenn du mehrere Autos hast:
Datenbank auf dem Server, und
entweder: der Client schickt eine ID seines Autos mit
oder: der Server identifiziert das Auto anhand des Clients

und läd dann das entsprechende Auto aus der Datenbank...

Datenbank kann in dieser Komplexitätsstufe auch ein Textfile sein... oder sogar nur eine Liste/Map
 
Zuletzt bearbeitet:
ja ich habe nur ein Auto. Genau darum gehts mir, wie kann ich dem Auto etwas "reinstopfen" was ich der Server vom Client bekommt?

die methode a.text() funktioniert ja so nicht.
 
Aus deiner Fehlerbeschreibung erkenne ich, dass bestimmt irgendwo Rauch aus deinem PC aufsteigt, wenn du die Methode a.setText() aufrufst...


Aber davon ab,
du erzeugst ein neues Auto a beim Erstellen der Klasse Server.
Deine Main Methode ist statisch - sie kann daher nicht so ohne weiteres auf eine KlassenVariable zugreifen.

2 Lösungen:

mach dir eine MainKlasse, die eine Main Methode hat, und in der erzeugst du einen neuen Server.

oder

erzeuge a erst in der Main Methode...


Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class Server {
 
    
    
    
    public static void main(String[] args) {
        try {
            Auto a = new Auto();
            ServerSocket server = new ServerSocket(5555);//Serversocket für Server
            System.out.println("Server gestartet!");
            
            Socket client = server.accept();//Client erzeugen wenn verbindung besteht
            
            //Streams
            
            //Daten zum Client; writer "sendet"
            OutputStream out = client.getOutputStream();
            PrintWriter writer = new PrintWriter(out);
            
            //Daten vom Client; Buffer "empfängt"
            InputStream in = client.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            //---------------------------------------------------
            
            String text = null;
            
            while((text = reader.readLine()) != null){ //liest Zeile aus
                System.out.println("Empfangen vom Client:" + text);
                
            }
            a.setText(text);
            writer.close();
            reader.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
 
    }
 
}
 
ich hab das jetzt so um geschrieben.

Ich würde gerne in der Mainmethode den Server eröffnen und die Variable text des Objektes a ausdrucken.
Jedoch erstelle ich das Objekt nun in der Klasse Server. Kann ein Objekt nicht von mehreren Klassen einfach benutzt werden?

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
	int port;
	
	public Server(int port){
		try{
		Auto a = new Auto(); <------------------------
		this.port = port;
		ServerSocket server = new ServerSocket(port);//Serversocket für Server
		System.out.println("Server gestartet!");
		
		Socket client = server.accept();//Client erzeugen wenn verbindung besteht
		
		//Streams
		
		//Daten zum Client; writer "sendet"
		OutputStream out = client.getOutputStream();
		PrintWriter writer = new PrintWriter(out);
		
		//Daten vom Client; Buffer "empfängt"
		InputStream in = client.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
		//---------------------------------------------------
		
		String text = null;
		
		while((text = reader.readLine()) != null){ //liest Zeile aus
			System.out.println("Empfangen vom Client:" + text);
			
		}
		a.setText(text); <-------------------------
		writer.close();
		reader.close();
		
		}catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        
		} 
    } 
		
}

Java:
import java.io.IOException;


public class Auto {
public String text = "hallo 1";

public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}


	public static void main(String[] args) throws InterruptedException, IOException {
		Server testserver = new Server(5556);
		System.out.println(a.text); <----------------------
	}

	
}
 
Zuletzt bearbeitet:
klar, du kannst das Objekt einfach übergeben...

aber nicht übers Netz... da musst du Serealisieren, oder nur Werte schicken


schmatisch:

Klasse2{
KlasseTausch tausch;
public setKlasseTausch(KlasseTausch t)
this,tausch = t;
}
KlasseTausch;

Klasse1{
KlasseTausch tausch = new KlasseTausch();

Klasse2 = new Klasse2(tausch);
}

du übergibst eine Referenz auf das Objekt.
Du kannst das einfach mal ausprobieren.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben