Client ergibt NULL?

Extremefall

Bekanntes Mitglied
Hallo,
ich habe eine kleine Client-Server-App. Nun habe ich folgenden Code, um den Clienten zu starten:
Java:
import java.net.*;
public class Execution_Client
{
	public static Client client;
public Execution_Client() throws Exception{
	client = new Client(InetAddress.getByName("127.0.0.1"),4447);
	}

public static void main(String[] args) throws Exception {
Execution_Client create = new Execution_Client();
}
}
Es klappt auch alles und die Klasse bleibt durch eine Endlosschleife der Klasse Client immer aktiv.

Nun möchte ich auf das Client-Objekt zugreifen. Nur wie kann ich es machen? Ich habe folgendes probiert:
Java:
if (Execution_Client.client == null){
    		System.out.println("No objekt");
    		System.out.println(Execution_Client.client);
    	}
    	
    	getscreenshot.addActionListener(Execution_Client.client);
Leider ergibt die Variable dort NULL, was ich nicht verstehen kann, da die Klasse Client ja nicht geschlossen wurde.

Wo kann der Fehler wohl liegen?
Der Vollständigkeitshalber hier noch die Klasse Client:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Client implements Runnable, ActionListener {
	private PrintWriter printWriter;
	private OutputStreamWriter outputstreamwriter;
	private OutputStream outputstream;
	private InputStream input;
	private Socket clientSocket;

	public Client(InetAddress IP, int port) {
		clientSocket = null;
		try {
			clientSocket = new Socket(IP, port);
			outputstream = clientSocket.getOutputStream();
			outputstreamwriter = new OutputStreamWriter(outputstream);
			printWriter = new PrintWriter(outputstreamwriter);
			Thread sender = new Thread(this);
			sender.start();
		}

		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void closeClient() {

	}

	public void sendMessage(String nachricht) {
		printWriter.println(nachricht);
		printWriter.flush();
	}
	public void diw(){
		System.out.println("Diw");
	}
	public void run() {
		while (true) {
			if (!clientSocket.isConnected()) {
				try {
					System.out.println("hi");
					clientSocket.close();
					System.exit(0);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == ServerGUI.getscreenshot) {
try {
            File file = new File("c:/IMG_0065.jpg");
            OutputStream out;
			
				out = clientSocket.getOutputStream();
			
            InputStream fileIn = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            while (fileIn.available()>0){
                out.write(buffer,0,fileIn.read(buffer));
            }
            fileIn.close();
			}catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			System.out.println("Sende");
			sendMessage("New Message");
			try {
				outputstream.close();
				clientSocket.close();
				System.exit(0);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		}
	}
}

Wieso hat die Variable den Wert NULL und wie kann ich das verhindern?
 
G

Gast2

Gast
Also deine Klasse Execution_Client schaut sehr merkwürdig aus ;)

Wo steht dieser Teil?
Java:
if (Execution_Client.client == null){
Erstellt da doch einfach eine Instanz von Client und arbeite damit weiter.
 

Extremefall

Bekanntes Mitglied
Der Teil steht in einer Server Klasse. Es soll nämlich so ablaufen:
1. Server wird erstellt
2. Client wird erstellt und verbindet sich mit dem Server
3. ServerGUI nutzt aktuelles Clientobjekt und weißt dieses einem ActionListener zu.

Das Problem an einer Instanzvariable ist, dass dafür dann ein neues Clientobjekt erstellt werden müsste. Ich will allerdings das bestehende Clientobjekt für den ActionListener verwenden.

Edit:
Wie soll ich denn eine Instanz erzeugen? Denn durch das Erzeugen einer Instanz der Klasse Execution_Client (oder wie ich sie genannt habe) wird ja ein neues Client Objekt erzeugt.
 

Lit-Web

Aktives Mitglied
Wieso deklarierst du eine statische Variable um sie als Objektinstanz zu nutzen? Das ist schon arg seltsam und eigentlich auch sinnlos.
 
Zuletzt bearbeitet:
G

Gast2

Gast
3. ServerGUI nutzt aktuelles Clientobjekt und weißt dieses einem ActionListener zu.
Was hat der Server mit dem Client zu tun? Die laufen doch in der Regel nichtmal auf dem selben Rechner.

Zeig mal besten mal deine Server- und Clientklassen.
 

Lit-Web

Aktives Mitglied
Indem du eine vernünftige Objektinstanz bildest und damit dann diverse Methoden aufrufst etc. So wie man halt mit Objekten arbeitet. Aber eine statische Objektinstanz ist jedenfalls Blödsinn, entweder statisch zur Klasse gehörend oder eben zum Objekt gehörend aber nicht so ein Mischmasch.
 

Extremefall

Bekanntes Mitglied
Hier einmal alle Klassen, die ich benutze:
Ich nutze übrigens das ganze momentan lokal. Sonst ist ja der Server nicht auf dem gleichen Rechner.
Client:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Client implements Runnable, ActionListener {
	private PrintWriter printWriter;
	private OutputStreamWriter outputstreamwriter;
	private OutputStream outputstream;
	private InputStream input;
	private Socket clientSocket;

	public Client(InetAddress IP, int port) {
		clientSocket = null;
		try {
			clientSocket = new Socket(IP, port);
			outputstream = clientSocket.getOutputStream();
			outputstreamwriter = new OutputStreamWriter(outputstream);
			printWriter = new PrintWriter(outputstreamwriter);
			Thread sender = new Thread(this);
			sender.start();
		}

		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void closeClient() {

	}

	public void sendMessage(String nachricht) {
		printWriter.println(nachricht);
		printWriter.flush();
	}
	public void diw(){
		System.out.println("Diw");
	}
	public void run() {
		while (true) {
			if (!clientSocket.isConnected()) {
				try {
					System.out.println("hi");
					clientSocket.close();
					System.exit(0);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == ServerGUI.getscreenshot) {
try {
            File file = new File("c:/IMG_0065.jpg");
            OutputStream out;
			
				out = clientSocket.getOutputStream();
			
            InputStream fileIn = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            while (fileIn.available()>0){
                out.write(buffer,0,fileIn.read(buffer));
            }
            fileIn.close();
			}catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			System.out.println("Sende");
			sendMessage("New Message");
			try {
				outputstream.close();
				clientSocket.close();
				System.exit(0);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		}
	}
}
Server:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Client implements Runnable, ActionListener {
	private PrintWriter printWriter;
	private OutputStreamWriter outputstreamwriter;
	private OutputStream outputstream;
	private InputStream input;
	private Socket clientSocket;

	public Client(InetAddress IP, int port) {
		clientSocket = null;
		try {
			clientSocket = new Socket(IP, port);
			outputstream = clientSocket.getOutputStream();
			outputstreamwriter = new OutputStreamWriter(outputstream);
			printWriter = new PrintWriter(outputstreamwriter);
			Thread sender = new Thread(this);
			sender.start();
		}

		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void closeClient() {

	}

	public void sendMessage(String nachricht) {
		printWriter.println(nachricht);
		printWriter.flush();
	}
	public void diw(){
		System.out.println("Diw");
	}
	public void run() {
		while (true) {
			if (!clientSocket.isConnected()) {
				try {
					System.out.println("hi");
					clientSocket.close();
					System.exit(0);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == ServerGUI.getscreenshot) {
try {
            File file = new File("c:/IMG_0065.jpg");
            OutputStream out;
			
				out = clientSocket.getOutputStream();
			
            InputStream fileIn = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            while (fileIn.available()>0){
                out.write(buffer,0,fileIn.read(buffer));
            }
            fileIn.close();
			}catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			System.out.println("Sende");
			sendMessage("New Message");
			try {
				outputstream.close();
				clientSocket.close();
				System.exit(0);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		}
	}
}
Execution_Client:
Java:
import java.net.*;
public class Execution_Client
{
	public static Client client;
public Execution_Client() throws Exception{
	client = new Client(InetAddress.getByName("127.0.0.1"),4447);
	}

public static void main(String[] args) throws Exception {
Execution_Client create = new Execution_Client();
}
}
Execution_Server:
Java:
import java.io.*;
public class Execution_Server{

public Execution_Server() throws Exception{
	
		Server server = new Server(4447);
	
}
public static void main(String[] args) throws Exception {
Execution_Server create = new Execution_Server();
}
}
ServerGUI:
Java:
import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;


public class ServerGUI {
public static JButton getscreenshot;
	/*
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
    	getscreenshot = new JButton("Screenshot vom Clienten anzeigen");
    	if (Execution_Client.client == null){
    		System.out.println("No objekt");
    		System.out.println(Execution_Client.client);
    	}
    	
    	getscreenshot.addActionListener(Execution_Client.client);
    	frame.add(getscreenshot);
    	frame.setVisible(true);
	}

}
Im Grunde soll also durch die ServerGUI der ActionListener auf die Clienten registriert wird. Wenn also von der Klasse ServerGUI ein ActionEvent ausgelöst wird, soll das von den verbundenen Clienten empfangen werden.
 
D

despikeexd

Gast
um mal auf den aller ersten post zurückzukommen

wenn eine Methode mit void als returntype deklariert ist und du dann einen static-call nach dem motto Klasse.methode() aufrufst returnt der natürlich null
du müsstest also auf das objekt zu greifen ... und nicht statisch auf die klasse
 
D

despikeexd

Gast
dann probier doch mal aus was bei

if(Klasse.staticMethod()==null)

raus kommt wenn wir staticMethod() mit static void annehmen
 

Extremefall

Bekanntes Mitglied
Geht es wirklich nicht ohne RMI? Was ist, wenn ich alle Klassen in das Package vom Clienten und Server packe, allerdings beim Clienten z.B. nur die Client-Klassen ausführe. Kann ich dann nicht auf die Server Methoden etc. zugreifen?
 
S

SlaterB

Gast
wenn du von allem den Quellcode hast, kannst du alles so umändern wie du es möchtest,
falls grundsätzlich RMI eingebaut, hat das aber gewisse technische Hürden zwischen Server und Client,
die direkte Listener eher verhindern, bis zu RMI ausbaust
 

Extremefall

Bekanntes Mitglied
Das Problem ist ja eigentlich nur, dass ich kein neues Client Objekt erzeugen möchte. Oder ist so etwas gar nicht schlimm?
Kann man ruhig einen Client zum Empfangen haben und zum Senden wird einfach eine neue Verbindung aufgebaut?
 
M

Marcinek

Gast
Ich glaube du verstehst dein Problem nicht.

Du hast zwei Prozesse

Java:
SERVER    <---------------------------------->        CLIENT

                                TCP
Und dazwischen TCP.

Nun möchtest du im Server eine Rferenz auf den Client haben!? - Wie soll das gehen? Höchstens mit RMI.

Client und Server haben i.d.R. nur eine Verbindung. Du musst halt sehen. Wenn ein Client 2 Verbindungen und zwei Ports benötigt, dann benötigen 10 Clients 20 Ports...

Der Server refernenziert doch seinen Client anhand des Streams.
 

Extremefall

Bekanntes Mitglied
Das heißt also, dass ich darauf einfach nicht zugreifen kann, da der Client eine andere JVM hat?

Gibt es ein möglichst einfaches (am besten auf deutsch) Tutorial, wo man sieht, wie man mit RMI einen ActionListener implementiert? Ich bin leider noch auf nichts passendes gestoßen.
 

XHelp

Top Contributor
Ich denke du sollst dich nicht fragen "Wie funktioniert RMI" sondern "Was habe ich für eine verkokste Struktur, dass der Server eine Instanz vom Client haben muss"
 

Extremefall

Bekanntes Mitglied
Es soll Remote Control möglich machen. Z.B. klickt der Server auf den Button. Dadurch wird beim aktuellen Clienten gesagt: "Erzeuge einen Screenshot" und das Ergebnis wird wieder zurück gesendet.
 
M

Marcinek

Gast
Obwohl du das scheinbar schon über RMI gelöst hast, merkst du sicherlich, dass du, wie von mir weiter oben benannt, an ganz andere Probleme stößt.

Mach doch einfach so:

1. Server starten
Horchen auf Port 12345
2. Client starten
a) Client verbinden mit Server
b) Server speichert Socket mit Client ID in HashMap.
c) Client liest auf Stream (blockerender aufruf! Server schickt nix...)

3. Server schickt "take picture". Das bedeutet, dass der Server iwas schickt, alles wird vom Client als "take picture" interpretiert.

4. Im Client rennt es weiter, weil Server was geschickt hat. ("Notify?").

5. Deine Logik

6. Client schickt das Ergebnis an den Server zurück.

Analog jeder weitere Client. Man muss nur auf dem Server entsprechendes Port FF einstellen für den einen Port. (logisch, kommt man kaum herum).

Es ist wichtig sich das ganze erstmal auf dem Papier bewusst zu werden. Momentan springst du hier Thematisch hin und her und versagst elendig.

Gruß,

Martin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
berserkerdq2 Sende eine Nachricht an den Client und leere den Ausgabestorm, was ist damit genau gemeint? Java Basics - Anfänger-Themen 3
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
I Client ObjectInputStream error... Java Basics - Anfänger-Themen 5
W Client verbindet sich nicht Java Basics - Anfänger-Themen 14
B Email Client in der eigenen Software einbauen Java Basics - Anfänger-Themen 3
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
E SocketServer/Client stürzt ab. Address already in use. Java Basics - Anfänger-Themen 2
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
E MCLauncher eigener Client workt nicht? Java Basics - Anfänger-Themen 4
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I Unique client information in WebApp Java Basics - Anfänger-Themen 3
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
Joew0815 Error org.apache.xmlrpc.client.XmlRpcClientConfigImpl.setUserAgent Java Basics - Anfänger-Themen 2
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
O Verriegeln, aber wo? Finde den Client der zu schließem ist. Java Basics - Anfänger-Themen 0
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
T Buffererwriter keine Exception obwohl Client weg Java Basics - Anfänger-Themen 2
E Client Server Java Basics - Anfänger-Themen 12
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
O Server Client Problem Java Basics - Anfänger-Themen 2
N Client soll mehrere Antworten von Servern gleichzeitig empfangen Java Basics - Anfänger-Themen 8
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
T Client-Fenster bei Aufruf unvollständig Java Basics - Anfänger-Themen 12
E Senden von Objects an Client. Variablenwerte kommen nicht an Java Basics - Anfänger-Themen 5
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
E Client hilfe!!! Java Basics - Anfänger-Themen 7
B RMI - Fehlermeldung auf dem Client Java Basics - Anfänger-Themen 6
X Applet - Client/Server Java Basics - Anfänger-Themen 2
E Socket (Client) dauerhaft aktiv? Java Basics - Anfänger-Themen 9
E HTTP Client - Login durchführen? Java Basics - Anfänger-Themen 4
L Ip-Adresse für Client Java Basics - Anfänger-Themen 14
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
L Wegwerf Client Java Basics - Anfänger-Themen 26
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
L Client aktualisieren Java Basics - Anfänger-Themen 6
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
J DNS-Client Java Basics - Anfänger-Themen 2
J Simpler DNS Client Java Basics - Anfänger-Themen 20
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
B Server-Client mit Thread ausstatten Java Basics - Anfänger-Themen 3
D Client-Server Problem Java Basics - Anfänger-Themen 2
J Netzwerkrprogammierung Client - Server Java Basics - Anfänger-Themen 3
J Netzwerkprogrammierung Client/Server Java Basics - Anfänger-Themen 16
G ArrayListe vom Server nach Client schicken Java Basics - Anfänger-Themen 17
M Flexiblen Client programmieren Java Basics - Anfänger-Themen 2
G JMS -> Wie Anmeldung vom Client an Server? Java Basics - Anfänger-Themen 4
S Webservice: Dateien downloaden vom Webserver auf den Client Java Basics - Anfänger-Themen 7
G Ausg. in JSP erzeugen die als Antwort an Client gesch. wird Java Basics - Anfänger-Themen 2
I Server / Client Programm wie einen String übergeben? Java Basics - Anfänger-Themen 6
K Client-Liste im Chat Java Basics - Anfänger-Themen 2
B Client - Server Verbindung über sockets mysql DB ansprechen? Java Basics - Anfänger-Themen 6
G Java Server Client Programmierung Java Basics - Anfänger-Themen 3
B Bild/Datei von einem Server an einen Client senden Java Basics - Anfänger-Themen 6
A Problem mit Ausgabe einer Liste über einen Client Java Basics - Anfänger-Themen 5
rambozola zugriff auf client bei j2ee anwendung Java Basics - Anfänger-Themen 10
G Mail Client öffnen Java Basics - Anfänger-Themen 9
D Server/Client Java Basics - Anfänger-Themen 8
T Datei über UDP verschicken . Speicherprobleme am Client Java Basics - Anfänger-Themen 4
H Server Client, es kommt nichts an. Java Basics - Anfänger-Themen 5
R client-applikation? Java Basics - Anfänger-Themen 5
G [Hilfe] Fileupload: Client-Server Java Basics - Anfänger-Themen 9
S Server/Client Verbindung Java Basics - Anfänger-Themen 2
G Dateidownload Client-Server (jsp) Java Basics - Anfänger-Themen 4
G Zugriff vom 'Server auf Client' Java Basics - Anfänger-Themen 4
S smtp-Client programmieren Java Basics - Anfänger-Themen 9
S Client-Server Java Basics - Anfänger-Themen 18
X client soll bat auf server ansprechen Java Basics - Anfänger-Themen 7
C client/server programm fehler ! Java Basics - Anfänger-Themen 20
F Wie kommen die Applets zum Client? Java Basics - Anfänger-Themen 7
C string über server/client verbindung senden ? Java Basics - Anfänger-Themen 4
T Client-Authentifizierung Java Basics - Anfänger-Themen 6
K [servcer/Client] Suche Server /Client Tutorial. Java Basics - Anfänger-Themen 2
G http client Java Basics - Anfänger-Themen 4
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
D Datentypen LocalDate.parse() ergibt Fehler Java Basics - Anfänger-Themen 5
G Taschenrechner ergibt Fehler in if-Abfrage Java Basics - Anfänger-Themen 6
SpaceCookie Warum ergibt 5,0 minus 4,9 nicht 0,1? Java Basics - Anfänger-Themen 12
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
E Was ergibt trim() auf einen leeren String Java Basics - Anfänger-Themen 3
S string index out of range - es ergibt keinen Sinn Java Basics - Anfänger-Themen 6
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
K Schnitt zweier Ebenen ergibt Gerade Java Basics - Anfänger-Themen 10
M Variablen Zinseszinsberechnung - Variable ergibt keinen Sinn Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben