Variablen von void-Methode in einer anderen Methode übernehmen/ausgeben

Also, nur zum sicher sein, dass ich alles richtig verstanden habe:
Wenn du auf Zeile 39 direkt:
Java:
System.out.println(socket.getLocalPort());
schreibst, dann wird in der Console der richtige Port ausgegeben?

Wo wird den der Wert der Variablen localport abgefragt?
Die Methode
Java:
getLocalPort()
wird ja nie aufgerufen.
 
Bist du sicher, dass die Variable localport zu dem Zeitpunkt wo du Methode getLocalPort() in der Klasse JavaChatServer aufrufst schon inizialisiert ist, also dass die Methode start() der Klasse JavaChatClient schon aufgerufen wurde?
 
Bist du sicher, dass die Variable localport zu dem Zeitpunkt wo du Methode getLocalPort() in der Klasse JavaChatServer aufrufst schon inizialisiert ist, also dass die Methode start() der Klasse JavaChatClient schon aufgerufen wurde?

Ja, weil ein einfaches
Java:
System.out.println(localport);
hinter der localport-Zuweisung reicht und ich den LocalPort zu sehen bekomme!
 
Wenn du damit die Zuweisung in der Methode start() meinst, dann sagt dies nichts aus!

Denn wenn du getLocalPort() aufrufst, und erst danach start(), dann wird natürlich in der Methode start() der korrekte Wert ausgegegben.
Aber zu dem Zeitpunkt zu welchem du getLocalPort() aufgerufen hattest, war die Variable noch nicht initialisiert.
 
Doch, die Lösung ist, dass du zuerst start() und erst danach getLocalPort() aufrufst.

Aber solange ich den Code der Klassen aus welchen diese Methoden aufgerufen werden nicht kenne,
kann ich dazu nicht viel mehr sagen.
 
Doch, die Lösung ist, dass du zuerst start() und erst danach getLocalPort() aufrufst.

Aber solange ich den Code der Klassen aus welchen diese Methoden aufgerufen werden nicht kenne,
kann ich dazu nicht viel mehr sagen.

Ok, hier der komplette Code aller 3 Klassen:

Server:
Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class JavaChatServer implements Runnable {
	public static final int PORT = 9999;
	protected ServerSocket listen;
	protected Vector connections;
	Thread connect;
	ArrayList al = new ArrayList();
	
	public static void main(String[] args) {
		new JavaChatServer();
	}
	
	public JavaChatServer() {
		try {
			listen = new ServerSocket(PORT);
		} catch (IOException e) {
			System.err.println("Fehler beim Erzeugen der Sockets: "+e);
			System.exit(1);
		}

		connections = new Vector();

		connect = new Thread(this);
		connect.start();
	}
	
	public void run() {
		try {
			while(true) {
				Socket client = listen.accept();
				
				Connection c = new Connection(this, client);
				connections.addElement(c);
				
				//Daten vom Client verarbeiten
				
				//Client zur Userliste hinzufügen
				al.add(new JavaChatClient().getLocalPort());
				//Client-Liste testweise ausgeben
				System.out.println(al);
			}
		} catch (IOException e) {
			System.err.println("Fehler beim Warten auf Verbindungen: " + e);
			System.exit(1);
		}
	}
	
	public void broadcast(String msg) {
		int i;
		Connection you;

		for(i = 0; i < connections.size(); i++) {
			you = (Connection) connections.elementAt(i);
			you.out.println(msg);
		}
	}
}

Connection:
Java:
import java.net.*;
import java.io.*;

public class Connection extends Thread {
	protected Socket client;
	protected DataInputStream in;
	protected PrintStream out;
	protected JavaChatServer server;
	
	public Connection(JavaChatServer server, Socket client)
	{
		this.server = server;
		this.client = client;

		try {
			in = new DataInputStream(client.getInputStream());
			out = new PrintStream(client.getOutputStream());
		} catch (IOException e) {
			try { client.close(); } catch (IOException e2) {} ;
			System.err.println("Fehler beim Erzeugen der Streams: " + e);
			return;
		}
		
		this.start();
	}
	
	public void run() {
		String line;

		try {
			while(true) {
				line=in.readLine();
				if(line != null)
					server.broadcast(line);
			}
		} catch (IOException e) {
			System.out.println("Fehler: " + e);
		}
	}
}

Client:
Java:
import java.net.*;
import java.io.*;
import java.awt.*;
import java.applet.*;

import javax.swing.JOptionPane;

public class JavaChatClient extends Applet implements Runnable {
	private static final long serialVersionUID = 1L;
	public static final int PORT = 9999;
	Socket socket;
	DataInputStream in;
	PrintStream out;
	TextField inputfield;
	TextArea outputarea;
	Thread thread;
	InetAddress ip = null;
	int localport;
	int localip;
	boolean connect;
	
	public void init() {
		inputfield = new TextField();
		outputarea = new TextArea();
		outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);
		this.setLayout(new BorderLayout());
		this.add("South", inputfield);
		this.add("Center", outputarea);
		this.setBackground(Color.lightGray);
		this.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		outputarea.setBackground(Color.white);
	}
	
	@SuppressWarnings("deprecation")
	public void start() {
		try {
			socket = new Socket(this.getCodeBase().getHost(), PORT);
			ip = socket.getInetAddress();
			localport = socket.getLocalPort();
			in = new DataInputStream(socket.getInputStream());
			out = new PrintStream(socket.getOutputStream());
			say("Verbindung zum Server aufgenommen...");
			connect = true;
			if (thread == null) {
				thread = new Thread(this);
				thread.setPriority(Thread.MIN_PRIORITY);
				thread.start();
			}
		} catch (IOException e) {
			this.showStatus(e.toString());
			say("Verbindung zum Server fehlgeschlagen!");
			connect = false;
			inputfield.disable();
		}
	}
	
	@SuppressWarnings("deprecation")
	public void stop() {
		try {
			socket.close();
			socket = null;
		} catch (IOException e) {
			//this.(e.toString());
		}
		if ((thread !=null) && thread.isAlive()) {
			thread.stop();
			thread = null;
		}
	}
	
	@SuppressWarnings("deprecation")
	public void run() {
		String line;

		try {
			Thread.sleep(100);
			while(true) {
				line = in.readLine();
				if(line != null || !line.equals("")) {
					outputarea.appendText(line + "\n");
				}
			}
		} catch (IOException e) {
			//say("Verbindung zum Server abgebrochen");
		} catch(Exception e) {
			say("Verbindung zum Server abgebrochen");
			connect = false;
			inputfield.disable();
		}
	}
	
	public boolean action(Event e, Object what) {
		if (e.target == inputfield) {
			String inp = (String) e.arg;
			out.println(inp);
			inputfield.setText("");
			return true;
		}
		return false;
	}

	@SuppressWarnings("deprecation")
	public void say(String msg) {
		outputarea.appendText("*** "+ msg +" ***\n");
		if(ip != null && connect == false) {
			outputarea.appendText(ip + " betritt den Raum!\n");
		} else if(ip != null && connect == true) {
			outputarea.appendText(ip + " verlässt den Raum!");
		}
	}
	
	public void setLocalPort(int localport) {
		this.localport = socket.getLocalPort();
	}
	
	public int getLocalPort() {
		return localport;
	}
}
 
Auf Zeile 41 der Klasse JavaChatServer machst du einen neuen JavaClient und rufst direkt getLocalPoart der neuen Instanz auf.
Zu diesem Zeitpunkt ist aber die Variable localport noch nicht inizialisiert worden, deshalb bekommst du dort auch nichts vernünftiges zurück.

Hat es einen Grund, dass du dort eine neue Instanz von JavaClient machts?
Wäre der Client, dessen LocalPort du auslesen willst nicht der Socket aus der Zeile 34 oder ist es Zufall, dass dieser Client heisst?
 
Auf Zeile 41 der Klasse JavaChatServer machst du einen neuen JavaClient und rufst direkt getLocalPoart der neuen Instanz auf.
Zu diesem Zeitpunkt ist aber die Variable localport noch nicht inizialisiert worden, deshalb bekommst du dort auch nichts vernünftiges zurück.

Ok, wie kann ich das vernünftig lösen, denn direkt danach mit einem
Code:
System.out.println(socket.getLocalPort());
bekomme ich was ich will?

Hat es einen Grund, dass du dort eine neue Instanz von JavaClient machts?
Wäre der Client, dessen LocalPort du auslesen willst nicht der Socket aus der Zeile 34 oder ist es Zufall, dass dieser Client heisst?

Ich glaube du hast recht, ich versuche das mal zu ändern wenn ich wieder zu Hause bin!
 
Zurück