Socket Aufruf einer Klasse in einer anderen Klasse

Zel2491

Aktives Mitglied
Moin moin,

folgendes Problem:

in meinem Chatprogramm habe ich derzeit folgende Klasse, um Nachrichten an den Server zu verschicken:

Java:
package network;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class SendToServer extends Thread {

	private DataOutputStream _out = null;

	private String msg = null;

	public SendToServer(Socket clientSocket, String msg) {

		try {
			_out = new DataOutputStream(clientSocket.getOutputStream());

			this.msg = msg;

			if (msg != null) {

				_out.writeBytes(this.msg + "\n");
				System.out.println("FROM CLIENT: \"" + msg + "\"");
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

		this.start();

	}

}

In meinem Konstruktor übergebe ich halt meinen Socket, da der für den DataOutputStream benötigt wird.

Dann will ich die Klasse woanders aufrufen - und zwar will ich sie aufrufen, wenn ich auf einen Button drücke, sprich: wenn ich meine Nachricht an den Server senden will:

Java:
new SendToServer(clientSocket, in.getText());

Code:
in.getText();
ist mein Textfeld, aus dem ich den Text ziehe, jedenfalls hat er die Variable clientSocket halt nicht...die ist wiederum ja in einer anderen Klasse...also wollte ich dann halt in meiner Methode was ändern:
Java:
private void actionHandler(Socket clientSocket) {
//...
}

nur ist das ein Teufelskreis und ich muss bei jedem Aufruf etwas ändern und am Ende geht gar nichts mehr... Hat da vllt wer eine bessere Idee, wie ich die Nachricht verschicken kann...?

So long,

Zel
 
öfters SendToServer-Objekte zu erstellen ist sowieso nicht gut,
jedesmal neuen DataOutputStream: wenn der geschlossen wird, könnte er den Socket-Stream schließen

im Client brauchst du eine zentrale Stelle, wo der Socket und auch ein genau EINMAL ersteller DataOutputStream dazu abgelegt ist,
diese zentrale Stelle muss natürlich überall bekannt sein, etwas dasselbe Problem welches zu selber schon zum Socket erkannt hast,

das ist ohne weiteres nicht zu beantworten, gibt verschiedene Strategien,
viele Aufrufe ändern zu müssen ist dabei nicht unbedingt falsch,
ist auch abhängig von deiner Listener-Klasse, actionHandler() sagt mir gar nix

die einfachste Variante wäre eine statische Variable, nicht sehr sauber, im einfachen Falle aber ausreichend
 
Okay...ich probiere es derweil mit der Variante der statischen Variable, dann kann ich die auch in der anderen Klasse problemlos aufrufen...

Nur baut sich jetzt meine GUI nicht mehr auf...bzw, das hat sie auch schon ohne die statische Variante nicht getan...

Ich habe zuerst ein Frame, wo ich in zwei Textfelder einmal den Nicknamen und die IP angebe...wenn das okay ist mache ich
Code:
 new UserInterfaceClient();
und
Code:
new Client();
, mein Client ist ein Thread aber meine GUI baut sich nicht zu Ende auf...:

Java:
package network;

import java.net.Socket;

public class Client extends Thread {

	public static Socket clientSocket = new Socket();

	public Client(String ip) {

		try {
			clientSocket = new Socket(ip, 2000);
			System.out.println("Verbindung hergestellt.");

			while (true) {

				new ListenToServer(clientSocket);
			}

		} catch (Exception e) {

			System.out.println("Verbindung konnte nicht hergestellt werden.");

		}

		this.start();

	}

	
}

Das GUI lädt er halt nicht zu Ende... 😀
 
was soll man denn von Code
Java:
  while (true) {
                 new ListenToServer(clientSocket);
            }
halten? läuft der ewig?
packe vielleicht alles an den Beginn der run()-Methode, damit es auch nebenläufig ausgeführt wird, und nicht die GUI blockiert
 
Der Code soll im Grunde auch ewig laufen, da dieser auf eine Nachricht vom Server wartet und mir diese dann (vorerst) in der Konsole ausgibt.

run()-Methode habe ich nicht wirklich...ich erbe ja von Thread und brauche dann keine... mit
Code:
this.start();
mache ich meinen Konstruktor zum Thread, wo auch der eben genannte Code drin ist.
 
tja, ganz abgesehen davon dass start() erst dahinter steht, rein logisch verständlich noch gar nicht drankommt,
und potentieller Zukunfscode keine programmrelevanten Auswirkungen hat (ok, könnte für Kompilierbarkeit wichtig sein),
liegst du mit Verzicht auf run() und Konstruktor-Code ganz einfach falsch

groß diskutieren lohnt nicht wirklich, schau nach woimmer du nachschauen magst,
ich bin gar großzügig und schreibe es in eine korrektere Variante um:
Java:
public class Client
    extends Thread
{

    private String ip;
    public static Socket clientSocket = new Socket();

    public Client(String ip)
    {
        this.ip = ip;
        start();
    }

    public void run()
    {
        try
        {
            clientSocket = new Socket(ip, 2000);
            System.out.println("Verbindung hergestellt.");

            while (true)
            {

                new ListenToServer(clientSocket);
            }

        }
        catch (Exception e)
        {

            System.out.println("Verbindung konnte nicht hergestellt werden.");

        }
    }


}
 
Vielen Dank, dass du dir so viel Mühe gegeben hast 😉
Ich lerne noch Java, also wenn ich was schreibe von wegen "run()-Methode hab ich nicht", dann ist das einfach nur Unwissenheit, dafür sry^^ Aber jetzt weiß ich es ja besser 😉

Läuft jetzt auch 🙂
 

Zurück
Oben