Chat-Client

tanzverfuehrung

Bekanntes Mitglied
also ich habe einen Chat- sErver und einen Chat -Client programmiert!
In swing habe ich alles hinbekommen, jetzt wollte ich versuchen die GUI in SWT zu schreiben.!
was ja eigentlich kein einfluss auf den client und den server hat...
sondern eigentlich müsste ich nur die GUI ändern!

es funktioniert nicht mehr...WIESO?


edit:Also wie ein chat funktioniert weiß ja jeder, man schriebt einen text in ein TextFeld und danach klickt man auf den Button "senden" ..und dann soll der text gesendet werden an den server und in das chat Feld ausgegeben werden!

also wenn ich z.b 123 eingebe und auf den Button klicke,kommt diese consolen ausgabe


netzwerkverbindung steht
gelesen: 123
Exception in thread "ReaderThread" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Widget.error(Unknown Source)
at org.eclipse.swt.widgets.Widget.checkWidget(Unknown Source)
at org.eclipse.swt.widgets.Text.append(Unknown Source)
at swtChat.ChatClienInSWT$EingehendReader.run(ChatClienInSWT.java:99)
at java.lang.Thread.run(Thread.java:722)

in meinem Programm java 99 ist:
Java:
eingehend.append(nachricht + "\n");

wieso sollte die zeile nicht funktionieren?!


also die verbindung steht ja, aber irgendwie kann es nicht eingefügt werden!?

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class ChatServerInSWT {

	ArrayList<PrintWriter> clientAusgabeStröme;

	public class ClientHAndler implements Runnable {
		BufferedReader reader;
		Socket socket;

		public ClientHAndler(Socket clientSocket) {
			try {
				socket = clientSocket;
				InputStreamReader isReader = new InputStreamReader(socket.getInputStream());
				reader = new BufferedReader(isReader);
			}
			catch (IOException e) {
				e.printStackTrace();
				System.out.println("ERROR4");
			}
		}

		@Override
		public void run() {
			String nachricht;
			try {
				while ((nachricht = reader.readLine()) != null) {
					System.out.println("gelesen: " + nachricht);
					esAllenWeitersagen(nachricht);
				}
			}
			catch (IOException e) {
				e.printStackTrace();
				System.out.println("ERROR5");
			}
		}

		private void esAllenWeitersagen(String nachricht) {
			Iterator<PrintWriter> it = clientAusgabeStröme.iterator();
			while (it.hasNext()) {
				try{
				PrintWriter writer = (PrintWriter) it.next();
				writer.println(nachricht);
				writer.flush();}
				catch (Exception e) {
					e.printStackTrace();
					System.out.println("ERROR6");
				}
			}
		}
	}
	public static void main (String[]args){
		ChatServerInSWT chatServer = new ChatServerInSWT();
		chatServer.los();
	}
	private void los() {
	clientAusgabeStröme = new ArrayList();
	try {
		ServerSocket serverSocket  = new ServerSocket(5000);
		while (true) {
			Socket clientSocket = serverSocket.accept();
			PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
			clientAusgabeStröme.add(writer);
			
			Thread t = new Thread(new ClientHAndler(clientSocket));
			t.setName("Thread");
			t.start();
			System.out.println("sie haben eine Verbindung");
		}
	}
	catch (IOException e) {
		e.printStackTrace();
		System.out.println("ERROR7");
	}
	}
}

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

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class ChatClienInSWT {

	Text eingehend;
	Text ausgehend;
	BufferedReader reader;
	PrintWriter writer;
	Socket socket;

	public static void main(String[] arg) {
		new ChatClienInSWT().los();
	}

	private void los() {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("Chat");
		FillLayout layout = new FillLayout();
		layout.type = SWT.VERTICAL;
		shell.setLayout(layout);

		ausgehend = new Text(shell, SWT.SINGLE);

		eingehend = new Text(shell, SWT.MULTI | SWT.V_SCROLL);
		eingehend.setEditable(false);
		// eingehend = new Browser(shell, SWT.MULTI | SWT.V_SCROLL);
		Button button = new Button(shell, SWT.PUSH);
		button.setText("Senden");
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				try {
					writer.println(ausgehend.getText());

					writer.flush();
				}
				catch (Exception ex) {
					ex.printStackTrace();
					System.out.println("ERROR1");
				}
				ausgehend.setText("");
			}
		});
		netzwerkEinrichten();
		Thread readerThread = new Thread(new EingehendReader());
		readerThread.setName("ReaderThread");
		readerThread.start();

		shell.pack();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	public void netzwerkEinrichten() {
		try {
			socket = new Socket("192.168.89.25", 5000);
			InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
			reader = new BufferedReader(streamReader);
			writer = new PrintWriter(socket.getOutputStream());
			System.out.println("netzwerkverbindung steht");
		}
		catch (IOException e) {
			e.printStackTrace();
			System.out.println("ERROR2");
		}
	}

	class EingehendReader implements Runnable {

		@Override
		public void run() {
			String nachricht;
			try {
				/** wenn was neues gesendet wurde... */
				while ((nachricht = reader.readLine()) != null) {
					System.out.println("gelesen: " + nachricht);

					/** fügt alle gesendeten NAchrichten in das Text Feld */
					eingehend.append(nachricht + "\n");
				}
			}
			catch (IOException e) {
				e.printStackTrace();
				System.out.println("ERROR3");
			}

		}
	}
}

reicht das als erklärung?
 
Zuletzt bearbeitet:

hdi

Top Contributor
es funktioniert nicht mehr...

Was für eine vorbildliche Fehlerbeschreibung :autsch: Topics, in denen pauschal das gesamte Programm hingeklatscht wird werden hier sowieso recht gern ignoriert. Wenn du dann nicht mal was genaueres dazu sagst kannst du dir das Topic gleich sparen. Also: Wenn du den Fehler schon nicht im Geringsten eingrenzen kannst, dann erkläre uns zumindest den Ist- und Soll-Zustand.
 
S

SlaterB

Gast
arbeite an deiner Art, anderen Informationen vorzuenthalten und genauso daran, es dem Programm dir gegenüber zu erlauben:
> catch (Exception ex) {}
Exceptions immer ausgeben ;)
 

tanzverfuehrung

Bekanntes Mitglied
Was für eine vorbildliche Fehlerbeschreibung :autsch: Topics, in denen pauschal das gesamte Programm hingeklatscht wird werden hier sowieso recht gern ignoriert. Wenn du dann nicht mal was genaueres dazu sagst kannst du dir das Topic gleich sparen. Also: Wenn du den Fehler schon nicht im Geringsten eingrenzen kannst, dann erkläre uns zumindest den Ist- und Soll-Zustand.


habe nochmal meine Fehlerbeschreibung überarbeitet.hoffe so ist es recht?
 

tanzverfuehrung

Bekanntes Mitglied
liegt es eventuell daran das ich die falsche Komponente genommen habe?
also in SWING benutze ich für die eigehenden Nachrichten JTextArena
und in SWT habe ich nun einfach TExt(SWT:MULTI) genommen!
ist das richtig oder muss ich eine andere Komponente nehmen und daran liegt mein fehler?!?!?!?!???:L
 
T

Tomate_Salat

Gast
Versuche es mal mit:
Java:
//EingehendReader von der ClientKlasse
display.asyncExec(new Runnable() {
    public void run() {
         eingehend.append(nachricht + "\n");
    }
});
 

hdi

Top Contributor
Die Komponente ist schon richtig. SWT hat dir einen Fehler aufgezeigt, der in deiner Swing-Version wohl auch vorliegt. Du hast es dort nur nie gemerkt. SWT hat ein idiotensicheres Konzept zur Vermeidung von Race Conditions in Verbindung mit dem EDT.

Was der Fehler heißt: Du versucht Code auszuführen, der die GUI beeinflusst (beim append ans Textfeld), und das ganze nicht aus dem EDT heraus. Und das ist in SWT verboten, und wie gesagt in Swing (leider) nicht verboten, aber dort genauso schlecht.

Lösung: Verlagerung des Codes auf den EDT:

Java:
display.asyncExec(new Runnable(){
     public void run(){
         // dein Code, zB das append an die Textarea
     }
});

edit: waah es gibt zuviele user hier :D Ich dachte ich bin der einzige der am Vormittag nix besseres zu tun hat

edit2 Um trotzdem noch etwas neues beizutragen: In deiner Swing-Version vom Code würde die Behebung dieses Fehlers (nochmal: Er existiert dort auch!) so aussehen:

Java:
SwingUtilities.invokeLater(new Runnable(){
     public void run(){
         // dein Code, zB das append an die Textarea
     }
});
 
Zuletzt bearbeitet:

hdi

Top Contributor
Hey, kannst du nicht lesen? Raus mit dir! :D

(Ich schreib den Post eig nur um dich darauf hinzuweisen dass du einen derben Grammatikfehler in deiner Signatur hast: it's -> its)
 

tanzverfuehrung

Bekanntes Mitglied
Versuche es mal mit:
Java:
//EingehendReader von der ClientKlasse
display.asyncExec(new Runnable() {
    public void run() {
         eingehend.append(nachricht + "\n");
    }
});

wo genau soll ich das einfügen???

Java:
class EingehendReader implements (display.asyncExec(new Runnable() {

so ja bestimmt nicht odeR?
also soll ich meine eigene Runnable weglassen(EingehenderReader)???


aber so geht es auch nicht??????
Java:
		Thread readerThread = new Thread(display.asyncExec(new Runnable() {
		@Override
		public void run() {
			String nachricht;
			try {
				/** wenn was neues gesendet wurde... */
				while ((nachricht = reader.readLine()) != null) {
					System.out.println("gelesen: " + nachricht);

					/** fügt alle gesendeten NAchrichten in das Text Feld */
					eingehend.append(nachricht + "\n");
				}
			}
			catch (IOException e) {
				e.printStackTrace();
				System.out.println("ERROR3");
			}

		}
		readerThread.setName("ReaderThread");
		readerThread.start();
		}));


tut mir leid aber irgendwie stehe ich aufen schlauch!
oder muss ich eine neues runnable erzeugen!?


edit:


oder meint ihr einfach so
???
Java:
		display.asyncExec(readerThread);
einfach meinem readerThread da hinzufügen?
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Die geposteten Zeilen erstzen einfach diese Zeile:
Java:
eingehend.append(nachricht + "\n");

besser gesagt, du schreibst das display.asyncExec darum. Das hat einfach nur zur folge, dass dieser Aufruf im EDT stattfindet. Also:

Java:
while (...) {
...
display.asyncExec(...

@Hdi: sorry :D
 

hdi

Top Contributor
so ja bestimmt nicht odeR?
Nein um Gottes Willen^^

also soll ich meine eigene Runnable weglassen(EingehenderReader)???
Nein, auch nicht

aber so geht es auch nicht??????
Nöö.

Du solltest mal nach anonyme Klasse googlen.

Es geht genauso wie es Tomate_Salat gepostet hat.

Aus:
Java:
 eingehend.append(nachricht + "\n");

machst du:
Java:
display.asyncExec(new Runnable() {
    public void run() {
         eingehend.append(nachricht + "\n");
    }
});

edit: what the.. ;(
 

tanzverfuehrung

Bekanntes Mitglied
so ich DANKE euch ganz doll♥
hdi und TomatenSalat...fühlt euch ganz fest gedrückt und geknutscht von mir!
haha

ohne euch, wäre ich da glaube nie drauf gekommen!!!!
:toll::applaus:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Chat erstellen AWT, Swing, JavaFX & SWT 13
O Focus zwischen Chat und Spiel wechselns AWT, Swing, JavaFX & SWT 3
W Applet Chat nicht Threadsicher AWT, Swing, JavaFX & SWT 3
J Chat GUI? AWT, Swing, JavaFX & SWT 7
M "Offline Chat" AWT, Swing, JavaFX & SWT 2
K JTextArea mit verschiedenen Farben betreiben [Chat] AWT, Swing, JavaFX & SWT 3
F Probleme mit Chat in Swing - NUR FÜR PROFIS - AWT, Swing, JavaFX & SWT 7
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
T Serversocket an Client Socket senden AWT, Swing, JavaFX & SWT 2
T LookAndFeel L&F Citrix-Server-Client AWT, Swing, JavaFX & SWT 4
H Lust auf eine Open-Source Lösung für universelle Java Client-Technologie? AWT, Swing, JavaFX & SWT 11
E Client-Server mittels AWT AWT, Swing, JavaFX & SWT 27
D Serverdirectory auf Client browsen mit JFileChooser AWT, Swing, JavaFX & SWT 7
Rudolf JavaFx als Client und MySQL AWT, Swing, JavaFX & SWT 9
E Swing Server-Client OnlineListe AWT, Swing, JavaFX & SWT 4
S Client-Server-Applikation mit GUI - Bugs ausmerzen AWT, Swing, JavaFX & SWT 4
F Applet vs Stand-Alone-Client AWT, Swing, JavaFX & SWT 3
J Client Server Anwendung - Mehrere Clients in einer Server GUI AWT, Swing, JavaFX & SWT 11
G Relativer Pfad in Rich Client Anwendung AWT, Swing, JavaFX & SWT 4
G Fertiger Email Client als Bibliothek AWT, Swing, JavaFX & SWT 5
D Standard Email Client starten AWT, Swing, JavaFX & SWT 8
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
O Trennung Gui und Logik - Strukturierte Client Anwendung AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben