Threads beim Server koordinieren

Status
Nicht offen für weitere Antworten.

Sara3112

Mitglied
Hallo Leute,

ich bin neu hier und ich weiß nicht genau, ob ich hier in richtige Forum schreibe. Aber ich habe ein großes Problem, woran ich schon lange sitze und ich bräuchte dringend Hilfe. Hinzu kommt das ich Programmier-Anfängerin bin. :(

Also ich entwickle einen Grafik-Editor mit Chat-Funktion. Dieser soll die Möglichkeit bieten Zeichnungen zu erstellen und mit anderen Usern zu chatten. Dabei soll aber auch die Zeichung verschickt werden können, welche dann beim Gegenüber auf das JPanel gezeichnet wird.

Die Chat-Funktion läuft Prima. Ich hab auch schon einen Thread erstellt für die Grafikübertragung. Mein Problem ist aber, dass ich nicht weiß, wie ich beim Server sagen kann, wann er aus welchem Thread lesen soll und was er wo übertragen soll.

Ich füge mal ein paar wichtige Code-Schnipsel hinzu, um mein Problem zu verdeutlichen.

Die Klasse ChatClient.java
Code:
	public void actionPerformed(ActionEvent e){
		Object obj = e.getSource();
		String cmd = e.getActionCommand();
		
		try{
			if(obj == button){
                          ...
						login();
					}
				}
			}
			if(obj == text){
				if(login){
					out.write(text.getText());
					out.newLine();
					out.flush();
				}
			}
		}
		....
	}

	private void login() throws IOException{
		socket = new Socket (host, port);
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		
                 .....
		
		t = new Thread(this);
		t.start();
	}

	public void run(){
		try{
			while (Thread.currentThread() == t){
				final String msg = in.readLine();
				if(msg == null)
					break;
				
				doUpdate(new Runnable(){
					public void run() {
						area.append(msg + "\n"); //area ist ein JTextArea
					}
				});
			}
		}
		catch (IOException e){}
	}

Die Klasse Grafikuebertragung.java:

Code:
    // hier wird das Bild auf der Zeichenfläche in den OutputStream geschrieben
    private void bildSenden() throws IOException{
		socket = new Socket(host, port);
         	cache = new ByteArrayOutputStream(64 * 1024);
		
       	if(Zeichenflaeche.buf != null){
    		System.out.println("Bild wird gesendet...");
    		ImageIO.write(Zeichenflaeche.buf, "jpeg", cache);
    		cache.flush();
    		byte[] array = cache.toByteArray();
    		final BufferedOutputStream output = new  BufferedOutputStream(socket.getOutputStream(), 64 * 1024);
    		output.write(array);
    		output.flush();
    		System.out.println("Bild wurde gesendet...");
    		
    	}	
		t = new Thread(this);
		t.start();		
	}
	
//Hier wird das empfangene Bild aus dem InputStream gelesen und in der Variablen //empfangenesBild gespeichert
	public void run(){
		try{
			while (Thread.currentThread() == t){
				
				final BufferedImage image;
				InputStream in = socket.getInputStream();
				byte[] array = new byte[64*1024];
				in.read(array);
				image = ImageIO.read(new ByteArrayInputStream(array));
				
				
				if(image == null){
		    		System.out.println("empfangenes Bild ist null");
					break;
				}
				
				doUpdate(new Runnable(){
					public void run() {
						empfangenesBild = image;
					}
				});
			}
		}
		catch (IOException e){}
	}

Und hier die Klasse Server:

Code:
	public void startServer(){
		try{
			ServerSocket server = new ServerSocket(port);
			
			
			while (true){
				Socket client = server.accept();
				new ChatThread(client).start();
				new GrafikuebertragungThread(client).start();
			}
		}...

private class GrafikuebertragungThread extends Thread {
			
		private Socket gu;
		private BufferedOutputStream bildOutput;

		
		public void run(){

				bildOutput = new BufferedOutputStream(gu.getOutputStream(), 64*1024);
				
				bildManager.add(bildOutput); //bildManager ist ein Vector vpm Typ BufferedOutputStream
				
				BufferedImage image;
				InputStream in = gu.getInputStream();
				byte[] array = new byte[64*1024];
				in.read(array);
				while ((image = ImageIO.read( new ByteArrayInputStream(array))) != null){
					sendImage(image);
				}...

		}
		
		
		// schickt das Bild an alle Benutzer, die in der Variable "bildManager" gespeichert sind
		private void sendImage(BufferedImage image){
			synchronized(manager){
				for (BufferedOutputStream bildOutput : bildManager){
					ByteArrayOutputStream cache = new ByteArrayOutputStream(64 * 1024);
					try{
						ImageIO.write(image, "jpeg", cache);
						cache.flush();
						byte[] array = cache.toByteArray();
						bildOutput.write(array);
						bildOutput.flush();

					}...
				}
			}
		}
	}
	}

 //und dann hab ich halt noch eine interne Klasse ChatThread, die die Textnachrichten entsprechend weiterleitet

Das ist alles ein bisschen viel. Aber ich weiß nicht, was gebraucht wird, um mir helfen zu können.
Wie gesagt, mein Problem ist, dass ich in der Klasse "Server" nicht weiß, wie ich ihm sagen soll, wann er welchen Thread benutzen soll.. Weil im Moment habe ich noch das Problem. dass er zum Beispiel, das Bild in einer Zeichenkette in der JTextArea ausgibt.

Ich wäre euch ewig dankbar, wenn ich mir helfen könntet. Bin schon sehr verzweifelt. :(

LG Sara
 

Sara3112

Mitglied
Also ich hab nu rausgefunden, dass man Threads einen Namen übergeben kann. Also hab ich das in den Klassen ChatClient und Grafikuebertragung auch gemacht. Aber ich weiß immer noch nicht, wie ich in der Klasse "Server" den Namen von dem aktuellen Thread abfragen kann. Könnt ihr mir weiterhelfen?
 

Kaffeebohn

Bekanntes Mitglied
Hi Sara,

Wie es aussieht nutzt du für die gesammte Kommunikation nur eine Verbindung, das heißt alle Threads schreiben in den gleichen Stream. Ist das so gewollt?
 

Paddelpirat

Bekanntes Mitglied
Hi,

wie wäre es wenn du statt zwei unterschiedlichen Threads für Text und Grafik, nur einen Thread verwendest und dafür eine Art kleines Protokoll schreibst?

Mit Protokoll meine ich eine bestimmte Formatierung der Zeichenkette, die du über den Socket-Stream verschickst.
Zum Beispiel könnte das so aussehen, dass du am Anfang und Ende einer "Nachricht" jeweils einen Tag einfügst:

<MSG>Deine Chat-Nachricht</MSG>
<IMG>DieBytesDeinerGrafik</IMG>

Dann müsstest du in deinem Thread, der die Nachrichten vom Client erhält nur noch die Tags analysieren und könntest anhand von denen entscheiden, ob der Client eine Nachricht, oder ein Bild für die anderen Benutzer geschickt hat.

So ein "Protokoll" könnte man natürlich später noch aufbauschen mit weiteren Befehlen, z.B. wenn du eine Nachricht an eine bestimmte Person versenden möchtest etc., aber das ist ein anderes Thema :wink:
 

Sara3112

Mitglied
Vielen lieben Dank für eure Antworten. An ein Protokoll habe ich anfangs auch gedacht.
Ich benutze jetzt auch nur noch einen Thread, aber ich verwende ObjectStream, wo ich dann mit instanceof überprüfe, ob es ein image bzw ein byte[] (da ich das image in ein byte[] konvertiert habe) oder ein string ist. Das läuft eigentl auch ganz gut. Nur an einigen Stellen gibt es noch Probleme. Falls meine Anwendung noch umfangreicher werden sollte, dann werde ich wahrscheinlich auch auf das Protokoll zurückgreifen.
Danke für eure Tipps.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18
OnDemand Json Objekt leeres Array beim lesen Netzwerkprogrammierung 9
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
A sporadischer Fehler beim Schreiben auf NAS Netzwerkprogrammierung 2
A Automatisches Update beim Starten Netzwerkprogrammierung 1
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
M Nur die erste Nachricht kommt beim Server an Netzwerkprogrammierung 11
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
A Probleme beim Klassen-Import von sun.misc. ... Netzwerkprogrammierung 19
B Probleme beim ersten Netzwerkprogramm Netzwerkprogrammierung 3
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
C ObjectInputReader wirft beim zweiten Aufruf eine Exception Netzwerkprogrammierung 3
Y RMI Initialisierung beim Server Netzwerkprogrammierung 10
B Socket Aufhängen beim Lesen Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
M Authentifizierung beim Start von Java-Applets Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
G Kryptische Zeichen beim Auslesen einer Website Netzwerkprogrammierung 11
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
K TrafficClass eines UDP Pakets kommt beim Empfänger nicht an Netzwerkprogrammierung 5
T Pfadangabe beim kopieren übers Netzwerk Netzwerkprogrammierung 5
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
G Blockieren beim Öffnen der In und Outputstreams Netzwerkprogrammierung 2
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
J Was bedeutet: Address already in use: connect (beim client?) Netzwerkprogrammierung 4
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
J Problem beim Senden von File Netzwerkprogrammierung 4
G unbekannte Zeichen beim senden und lesen Netzwerkprogrammierung 2
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
P problem beim schließen eines Streams Netzwerkprogrammierung 6
J RMI Fehler beim Proxy Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
C Session Problem beim Zugriff auf Webseiten Netzwerkprogrammierung 3
J while-Schleife / Abbruchbed. beim Einlesen eines Streams Netzwerkprogrammierung 4
M Fehlende Bits / Bytes beim kopieren Netzwerkprogrammierung 4
I Apache http-client: Problem beim Proxyaufruf Netzwerkprogrammierung 2
C RMI: Problem beim Aufruf einer Methode. Falsch gecastet? Netzwerkprogrammierung 8
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
G ActionEvent klappt beim Chat nicht Netzwerkprogrammierung 5
megachucky RMI - AccessControlException beim Naming.lookup() Netzwerkprogrammierung 12
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
M sessionhandling beim webserver Netzwerkprogrammierung 5
D Bekomme Dummyspace beim Internetseiten auslesen Netzwerkprogrammierung 2
R Problem beim Senden von Emails (Javamail) Netzwerkprogrammierung 2
TRunKX Hilfe beim senden und empfangen Netzwerkprogrammierung 2
S Probleme beim Beschränken der Geschwindigkeit Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben