unten seht ihr zwei Methoden, mit denen ich jeweils per JButton-Tastendruck eine Socketverbindung aufbauen
möchte. Socket verbindung kommt zwar zu Stande, aber dann hängt sich die GUI auf (Buttons bleiben gedrückt).
Ich denke die while-Anweisungen aus beiden Methoden blockieren die GUI. Hat einer von euch eine Idee wie man das Problem
lösen könnte ?
Danke euch schonmal im vorraus...
Code:
//#######
//# CLIENT
//#######
public void netClientStart() {
stop=false;
try {
echoSocket = new Socket(serverName, port);
//Objekte für ausgehende(out) und ankommende(in) Ströme erzeugen
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
status=true;
} catch (IOException e) {
status=false;
System.out.print("Fehler beim Aufbau einer Socketverbindung zum Server:" + e.toString());
}
try{
while (status==true) {
receiveMessageClient(in.readLine());
echoSocket.close();}
} catch (IOException e) {
e.printStackTrace();
}}
//########
//# SERVER #
//########
public void netServerStart() {
try {
ServerSocket server = new ServerSocket(3141);
socket = server.accept();
System.out.print("Verbindung aufgebaut");
} catch (IOException e) {
System.out.print("Verbindungsfehler");
}
try{
out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (stop==false) {
receiveMessageClient(in.readLine());
}
} catch (IOException e) {
}
}
hab's mir jetzt nicht im Detail angeschaut, aber... Du hast hier ja schonmal mindestens zwei nie endende Prozesse, die parallel ausgeführt werden müssen (gui und kommunikation über diesen socket da), also brauchst du doch auch zwei threads für dise beiden aufgaben. Swing läuft sowieso, jetzt musst du nur noch die kommunikation in einem anderen thread erledigen.
Um die Frage aus dem gelöschten Thread zu beantworten: Ja, du kannst deine eigenen Beiträge einige Zeit lang löschen, aber selbstverständlich nur wenn du angemeldet bist (wenn das jeder gast oder spambot könnte, wär's ja auch ein wenig übertrieben^^ )
Habe den Vorschlag mit seperaten Threads versucht umzusetzen, leider tritt weiterhin das gleiche Problem auf.
Habe diesmal den Server und Client jeweils in einer eigenen Klasse geschrieben (mit extends Thread).
Socket wird aufgebaut und Nachrichten verschicken klappt auch, aber meine GUI hängt. Sobald ich die
While-Schleide aus der Client und Serverklasse rausnehme funktioniert auch die GUI, aber dann wird ja die Leitung nicht abgehorcht. Habe paar Instanzvariablen weggegelassen, damit es nicht soviel wird...
Wenn ich eine Socketverbindung aufgebaut habe. Beide JButtons
bleiben gedrückt und das wars.
weiß nicht mehr weiter
Code:
/*MAIN-Klasse*/
public startBS() {
super();
gui=new GUI(this);
}
public void netClientStart() {
client=new NetClient("station",3141,this);
client.start();
}
public void netServerStart(){
server=new NetServer(this);
server.start();
}
public static void main(String[] args) {
startBS st=new startBS();
st.start();
}
}
Code:
public class NetServer extends Thread {
super();
public NetServer(startBS startBS) {
super();
this.startBS=startBS;
try {
ServerSocket server = new ServerSocket(3141);
socket = server.accept();
System.out.print("Server: Verbindung zu Client aufgebaut");
} catch (IOException e) {
System.out.print("Verbindungsfehler");
}
try{
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("Servertestnachricht!");
while (stop==false) { //**HIER LIEGT DAS PROBLEM**
receiveMessage(in.readLine());
}
} catch (IOException e) {
System.err.println(e.toString());}
}
public void receiveMessage(String a) {
System.out.print("Vom Client:"+a);
}
}
Code:
public NetClient(String serverName, int port,startBS startBS){
super();
try {
echoSocket = new Socket(serverName, targetPort);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
status=true;
out.println("Clienttestnachricht !");
} catch (IOException e) {
status=false;
System.out.print("Fehler beim Aufbau einer Socketverbindung zum Server:" + e.toString());
}
//Falls Socket aufgebaut auf ankommenden Strom horchen
try {
while (status==true) {
System.out.print(in.readLine());}
} catch (IOException e) {
e.printStackTrace();
}
}
public void receiveMessage (String m){
System.out.print("Vom Server:"+m);
}
}
echt? wundert mich aber. Imho dürfte es immer noch nicht laufen. Für mich sieht's nämlich so aus, als hättest du die while-schleifen schon in den Konstruktor reingebaut, wo die eigentlich überhaupt nicht hingehören. Das alles kommt natürlich in run() und danach muss der thread per start() gestrartet werden.
sowas bitte nächstes mal nicht posten. Wenn du eine Lösung gefunden hast, dann schreib bitte kurz hin, wie die ausgesehen hat, damit die Leute später in der Suche nicht nur deine Frage, sondern auch die Antwort auf die Frage finden (gilt jetzt nicht nur hier, sondern allgemein bei solchen foren/boards etc)