Client Server Anwendung - Mehrere Clients in einer Server GUI

jabbaDUH

Mitglied
Hallo Forum,

dies mein erster Thread in Sachen Java und ich würde mich freuen, wenn Ihr mir helfen könntet ;)

Zu beginn erst einmal eine kleine Übersicht:
Ich möchte eine Client/Server Applikation in Eclipse realisieren. Der Client soll sich zum Server verbinden und ihm in regelmäßigen Abständen Informationen senden.

Auf Konsolenebene funktioniert das ganze auch schon ganz gut. Der Client verbindet sich, der Server empfängt und gibt die Informationen auf der Konsole aus. Auch mehrere Clients können sich verbinden, alles kein Problem.

Nun möchte ich für den Server eine GUI schreiben. Es sollten in einem Fenster die Werte der Clients als JProgressbar dargestellt werden (JProgressbar als dynamisches Diagramm missbraucht ;) )

Soweit so gut. Verbindet sich nun ein Client, wird auch eine GUI erzeugt. Verbindet sich jedoch ein weiterer, wird erneut eine GUI erzeugt. Warum das so ist verstehe ich auch. Nur möchte ich nun diese beiden Jframes zusammenpacken. Das gelingt mir nun seit 3 Tagen nicht...

Hier erstmal der Quelltext des Servers:

Java:
package Client_Server;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Container;

public class Server extends JFrame implements Runnable {
	
	private static final long serialVersionUID = 1L;
	
	Socket socket;
	BufferedReader server_in;
	String s;
	int link, maxlink;
	JProgressBar statusBar;
	JTextArea textArea;
	
	
	public Server(Socket s) {
		socket = s;
	
	}
	
	public void run() {
		
		System.out.println("Server - connection started to "
				+ socket.getInetAddress());
		
		String str;
		
		try {
			
			server_in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			
			while ((s = server_in.readLine()) != null) {
				
//SCHNIPP
//Client Nachrichten bearbeiten
//SCHNAPP
				System.out.println("max link: " + maxlink);
				System.out.println("link: " + link);
				
				textArea.append("maxlink:" + maxlink + "\n");
				statusBar.setMaximum(maxlink);
				statusBar.setValue(link);
				
			
				
			}
			
			server_in.close();
			
		} catch (Exception e) {
			System.out.println("Server " + e);
		}
		
		try {
			socket.close();
			System.out.println("socket closed");
		} catch (Exception e) {
		}
		System.out.println("Server - connection closed.");
	}
	
	public void create_gui() {
		//TestGUI
		JLabel nachrichtenLabel;
		
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(150, 200);
		setTitle("Monitor");
		
		Container cp = getContentPane();
		cp.setLayout(new BorderLayout());
		
		statusBar = new JProgressBar(0, 100);
		statusBar.setValue(0);
		statusBar.setStringPainted(true);
		
		nachrichtenLabel = new JLabel("empfangene Nachrichten:");
		cp.add(nachrichtenLabel, BorderLayout.NORTH);
		cp.add(statusBar, BorderLayout.SOUTH);
		textArea = new JTextArea("", 1, 1);
		textArea.setLineWrap(true); 
		textArea.setEditable(false);
		cp.add(textArea, BorderLayout.CENTER);
		cp.add(new JScrollPane(textArea), BorderLayout.CENTER);
		
		setVisible(true);
		
	}
	

	
	private void update_gui() {
		
		//Hier eventuell die GUI neu zeichnen?
		
	}
	public static void main(String[] args) {
		
		ServerSocket server = null;
		Socket s = null;
		Server myServer = null;
		Thread t;
		
		try {
			server = new ServerSocket(1234);
			
			while (true) {
				s = server.accept();
				myServer = new Server(s);
				myServer.create_gui();
				//myServer.update_gui();
				t = new Thread(myServer);
				t.start();
				
			}
			
		} catch (Exception e) {
			System.out.println("ServerMain " + e);
		}
		try {
			server.close();
			
		} catch (Exception ex) {
		}
	}


	
}
 

Michael...

Top Contributor
Mal abgesehen von Sinn und Unsinn einer Serversoftware eine GUI zu verpassen, erzeugst Du ja mit jeder Anmeldung eines Clients ein neues Objekt vom Typ Server und somit eine neue GUI
[JAVA==121]while (true) {
s = server.accept();
myServer = new Server(s);[/code]
Wenn dann wäre es doch besser die Clients bzw. die darzustellenden Infos in einer Liste zu halten und z.B. in einer JList anzuzeigen.
 

jabbaDUH

Mitglied
Hallo Michael...

Genau das ist mein Problem. Ich weiß schon, warum ich immer eine neue GUI bekomme. Ich hab schon versucht nicht immer ein neues Objekt vom Server zu erstellen, nur dann funktioniert meine Verbindung nicht mehr.
Ich hatte eigentlich gedacht, dass es auch reichen würde nur den Socket in einen Thread zu packen. Aber das kriege ich nicht hin.

Wie genau meinst du das mit einer liste?
 

Michael...

Top Contributor
Wie genau meinst du das mit einer liste?
z.B. die relevanten Information/Objekte in einer ArrayList speichern.

Oder wie in folgendem BspCode in einem Model (hier konkret DefaultListModel).
Der ganze Code ist ein bisschen komprimiert, ich hoffe es wird trotzdem deutlich. Entscheidend ist die Klasse Server (ab Zeile 25) und deren innere Klasse GUI (Zeile 58 bis 83), der Rest drumrum ist nur zu Demozwecken, die Clients senden in zufälligen Abständen Ihren Status (0 bis 100)
Java:
import java.awt.*;
import java.io.*;
import java.net.*;

import javax.swing.*;

public class ServerClientDemo {
	
	public ServerClientDemo() {
		new Thread(new Runnable() {
			public void run() {
				new Server().start();
			}
		}).start();
		System.out.println("Server started");
		for (int i=0; i<10; i++) {
			try {
				Thread.sleep((long)(Math.random()*2000));
				new Client().start();
				System.out.println("Client started");
			} catch (Exception e) {e.printStackTrace();}
		}
	}
	
	class Server {
		private GUI gui;
		private int clientIndex;
		private Socket socket;
		
		public void start() {
			gui = new GUI();
			clientIndex = 0;
			try {
				ServerSocket serverSocket = new ServerSocket(5555);
				while (true) {
					socket = serverSocket.accept();
					gui.addClient();
					new Thread(new Runnable() { //Thread zum Empfangen der Statusmeldungen
						private int index = clientIndex++;
						private int status = 0;
						public void run() {
							try {
								BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
								String in;
								while ((in = reader.readLine()) != null)
									Server.this.setStatus(index, Integer.parseInt(in));
							} catch (Exception exc) {exc.printStackTrace();}
						}
					}).start();
				}
			} catch (Exception exc) {exc.printStackTrace();}
		}
		
		public void setStatus(int i, int status) {
			gui.setStatus(i, status);
		}
		
		class GUI extends JFrame {
			private DefaultListModel model;
			
			public GUI() {
				JList list = new JList(model = new DefaultListModel());
				list.setCellRenderer(new DefaultListCellRenderer() {
					private JProgressBar bar = new JProgressBar();
					public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
						bar.setValue(Integer.parseInt(value.toString()));
						return bar;
					}
				});
				this.getContentPane().add(new JScrollPane(list));
				this.setBounds(0, 0, 200, 200);
				this.setLocationRelativeTo(null);
				this.setVisible(true);
			}
			
			public void addClient() {
				model.addElement(0);
			}
			
			public void setStatus(int index, int status) {
				model.setElementAt(status, index);
			}
		}
	}
	
	class Client {
		public void start() throws Exception, IOException {
			final Socket socket = new Socket("127.0.0.1", 5555);
			final PrintWriter writer = new PrintWriter(socket.getOutputStream());
			new Thread(new Runnable(){
				int status = 0;
				public void run() {
					while(status <= 100) {
						try {
							Thread.sleep((long)(Math.random()*5000));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						writer.println(status);
						writer.flush();
						status +=10;
					}
				}
			}).start();
		}
	}

	public static void main(String[] args) {
		new ServerClientDemo();
	}
}
 

jabbaDUH

Mitglied
Michael..., du bist der Größte :toll:

danke schon mal soweit, da wäre ich im Leben nicht drauf gekommen. :noe:

Ich habe das von dir Gegebene nun soweit verfeinert, dass ich den vom Client gelieferten Wert "link" als Wert (value) der ProgressBar setzen kann. Nun möchte ich aber bei der Progressbar auch den maxWert ändern (da sich der von Client zu Client unterscheiden kann).



Java:
class Server {
	private GUI gui;
	private int clientIndex;
	private Socket socket;
	
	public void start() {
		gui = new GUI();
		clientIndex = 0;
		try {
			ServerSocket serverSocket = new ServerSocket(5555);
			while (true) {
				socket = serverSocket.accept();
				gui.addClient();
				new Thread(new Runnable() { // Thread zum Empfangen der
											// Statusmeldungen
							private int index = clientIndex++;
							
							
							public void run() {
								try {
									StringTokenizer t = null;
									String str;
									int link, maxlink;
									BufferedReader reader = new BufferedReader(
											new InputStreamReader(socket
													.getInputStream()));
									String in;
									while ((in = reader.readLine()) != null){
									System.err.println("SERVER GETS: before" + in);
									t = new StringTokenizer(in);
									str = t.nextToken("|");
									link = Integer.parseInt(str);
									System.err.println("SERVER GETS: link after" + link);
									str = t.nextToken().substring(1);
									maxlink = Integer.parseInt(str);
									
									System.err.println("SERVER GETS: maxlink after" + maxlink);
										//Server.this.setStatus(index, Integer.parseInt(in));
										Server.this.setStatus(index, link);
									}
								} catch (Exception exc) {
									exc.printStackTrace();
								}
							}


							
								
								
							
						}).start();
			}
		} catch (Exception exc) {
			exc.printStackTrace();
		}
	}
	
	public void setStatus(int i, int status) {
		gui.setStatus(i, status);
	}
}



class Client {
    public void start() throws Exception, IOException {
        final Socket socket = new Socket("127.0.0.1", 5555);
        //final PrintWriter writer = new PrintWriter(socket.getOutputStream());
        
        new Thread(new Runnable(){
            int status = 0;
            public void run() {
            	Monitor m = new Monitor();
    			String maxlink = null;
				try {
					maxlink = m.max_link();
					
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
                while(true) {
                    try {
                    	PrintWriter client_out = null;
                    	
                        Thread.sleep((long)(Math.random()*5000));
                        
                        System.out.println("Server " + socket.getInetAddress()
        						+ " reads hardware information.");
        				
        				client_out = new PrintWriter(socket.getOutputStream(), true);
        				client_out.println(m.signal() + "|" + maxlink);
        				//System.out.println(m.signal() + "|" + maxlink);
                    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
                    //client_out.println(status);
                    //client_out.flush();
                    status +=10;
                }
            }
        }).start();
    }
}


class GUI extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private DefaultListModel model;
	
	public GUI() {
		JList list = new JList(model = new DefaultListModel());
		list.setCellRenderer(new DefaultListCellRenderer() {
			
			private static final long serialVersionUID = 1L;
			
			private JProgressBar bar = new JProgressBar();
			
			public Component getListCellRendererComponent(JList list,
					Object value, int index, boolean isSelected,
					boolean cellHasFocus) {
				System.err.println("GUI GETS:" + value);
				bar.setValue(Integer.parseInt(value.toString()
				//bar.setMaximum(maxlink);	<-------- genau hier komme ich nicht an den MaxLink	
				
				));
				return bar;
			}
		});
		this.getContentPane().add(new JScrollPane(list));
		this.setBounds(0, 0, 200, 200);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	public void addClient() {
		model.addElement(0);
	}
	
	public void setStatus(int index, int status) {
		model.setElementAt(status, index);
	}
}

Kannst du mir hier noch auf die Sprünge helfen?

Thomas
 

jabbaDUH

Mitglied
Ich bins nochmal.. die Geschichte mit der ProgressBar hat sich erledigt ;)

Nur blick ich durch den QT von dir nicht 100%ig durch... wie krieg ichs nu zb hin, vor jeder ProgressBar n Label zu platzieren? Außerdem würde ich gerne einen ActionListener implementieren, der beim Klick auf die Progressbar ein neues Fenster öffnet, um zusätzliche Informationen zum Client anzuzeigen?

Danke schon mal =)

MFG Thomas
 

Meru

Bekanntes Mitglied
Also wenn du noch ein JLabel voranschreiben willst, dann würde ich ggf eine Tabelle statt eine JList nehmen.
Du kannst natürlich dem Renderer sagen, dass du nicht die Bar angezeigt haben willst, sondern ein JPanel, auf dem links ein Label ist und rechts die Bar, aber ist vielleicht etwas unschön. Hast dann aber den Nachteil, dass je nach länge des vorangestellten Labels die Bar verschiebt, sprich, sie sind nicht mehr alle exakt untereinander. Man kann da zwar wieder mit LayoutManager arbeiten, aber das ist in meinen Augen zu sehr wirwa.

Einen ActionListener kann man nicht an eine JList ranhängen, jedoch einen MouseListener oder aber einen ListSelectionListener.
Bei einem MouseListener kannst du den Clickcount abfragen (also Doppelklick oder so) und dann von der Liste den aktuell selektierten Index auslesen.
Bei einem ListSelectionLister wird jedesmal ein Event ausgelöst, sobald sich die Selektion ändert, also auch bei einem einfach Klick. Da hast du also nicht die Möglichkeit, erst dann das Popup zu öffnen, wenn du einen Doppelklick gemacht hast.

Aber hier mal die Variante, die das Problem zeigt (Mit Label und Bar in einer JList):
[Java]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
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 javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

public class ServerClientDemo {

public ServerClientDemo() {
new Thread(new Runnable() {
public void run() {
new Server().start();
}
}).start();
System.out.println("Server started");
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long) (Math.random() * 2000));
new Client().start();
System.out.println("Client started");
} catch (Exception e) {
e.printStackTrace();
}
}
}

class Server {
private GUI gui;
private int clientIndex;
private Socket socket;

public void start() {
gui = new GUI();
clientIndex = 0;
try {
ServerSocket serverSocket = new ServerSocket(5555);
while (true) {
socket = serverSocket.accept();
gui.addClient();
new Thread(new Runnable() { // Thread zum Empfangen der
// Statusmeldungen
private int index = clientIndex++;
private int status = 0;

public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String in;
while ((in = reader.readLine()) != null)
Server.this.setStatus(index, Integer.parseInt(in));
} catch (Exception exc) {
exc.printStackTrace();
}
}
}).start();
}
} catch (Exception exc) {
exc.printStackTrace();
}
}

public void setStatus(int i, int status) {
gui.setStatus(i, status);
}

class GUI extends JFrame {
private DefaultListModel model;

public GUI() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JList list = new JList(model = new DefaultListModel());

list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2){
JOptionPane.showMessageDialog(GUI.this, "selektierter Index: " + list.getSelectedIndex());
}
}
});

list.setCellRenderer(new DefaultListCellRenderer() {
private JPanel panel;
private JProgressBar bar = new JProgressBar();
private JLabel label = new JLabel();

private Color defaultForground = bar.getForeground();
private Color defaultBackground = bar.getBackground();

public Component getListCellRendererComponent(JList list, final Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (panel == null){
panel = new JPanel(new BorderLayout());

panel.add(label, BorderLayout.WEST);
panel.add(bar, BorderLayout.CENTER);
}

bar.setValue(Integer.parseInt(value.toString()));
bar.setStringPainted(true);

label.setText(value.toString() + "%");

if (isSelected){
bar.setForeground(Color.RED);
bar.setBackground(new Color(255,200,200));
}else{
bar.setForeground(defaultForground);
bar.setBackground(defaultBackground);
}

return panel;
}
});
this.getContentPane().add(new JScrollPane(list));
this.setBounds(0, 0, 200, 200);
this.setLocationRelativeTo(null);
this.setVisible(true);
}

public void addClient() {
model.addElement(0);
}

public void setStatus(int index, int status) {
model.setElementAt(status, index);
}
}
}

class Client {
public void start() throws Exception, IOException {
final Socket socket = new Socket("127.0.0.1", 5555);
final PrintWriter writer = new PrintWriter(socket.getOutputStream());
new Thread(new Runnable() {
int status = 0;

public void run() {
while (status <= 100) {
try {
Thread.sleep((long) (Math.random() * 5000));
} catch (InterruptedException e) {
e.printStackTrace();
}
writer.println(status);
writer.flush();
status += 10;
}
}
}).start();
}
}

public static void main(String[] args) {
new ServerClientDemo();
}
}
[/Java]
 

jabbaDUH

Mitglied
Hey, danke Meru :toll:

Damit bin ich nun wieder etwas weiter gekommen... Danke ;)
Doch meine Ahnungslosigkeit reißt nicht ab: Ich wollt nu auf dem Label die Client IP ausgeben..
hab versucht mit ner gebastelten get/set methode.. aber ich kriegs mal wieder nicht hin :(


Gruß Thomas
 

Meru

Bekanntes Mitglied
Doch meine Ahnungslosigkeit reißt nicht ab: Ich wollt nu auf dem Label die Client IP ausgeben..
hab versucht mit ner gebastelten get/set methode.. aber ich kriegs mal wieder nicht hin :(
Java:
socket = serverSocket.accept();
socket.getRemoteSocketAddress(); // liefert die IP und den Port des Clients, der sich mit dem Server verbunden hat

Jetzt wird das mit der JList alles ein klein wenig komplizierter, denn jetzt musst der JList nicht einfach nur einen Wert geben, sondern ein Objekt, welches mehrere Werte beinhaltet (IP und Progress). Ein Objekt deswegen, weil ja IP und Progress in Relation stehen.


Aber möglich ist das alles, irgendwie ;)

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
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 javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

public class ServerClientDemo {

	public ServerClientDemo() {
		new Thread(new Runnable() {
			public void run() {
				new Server().start();
			}
		}).start();
		System.out.println("Server started");
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep((long) (Math.random() * 2000));
				new Client().start();
				System.out.println("Client started");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	class Server {
		private GUI		gui;
		private int		clientIndex;
		private Socket	socket;

		public void start() {
			gui = new GUI();
			clientIndex = 0;
			try {
				ServerSocket serverSocket = new ServerSocket(5555);
				while (true) {
					socket = serverSocket.accept();
					
					gui.addClient(new ServerClientObject(0, socket.getRemoteSocketAddress().toString()));
					
					new Thread(new Runnable() { // Thread zum Empfangen der
												// Statusmeldungen
								private int	index	= clientIndex++;
								private int	status	= 0;

								public void run() {
									try {
										BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
										String in;
										while ((in = reader.readLine()) != null)
											Server.this.setStatus(index, Integer.parseInt(in));
									} catch (Exception exc) {
										exc.printStackTrace();
									}
								}
							}).start();
				}
			} catch (Exception exc) {
				exc.printStackTrace();
			}
		}

		public void setStatus(int i, int status) {
			gui.setStatus(i, status);
		}

		class GUI extends JFrame {
			private DefaultListModel	model;
			private JList list;
			
			public GUI() {
				this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				
				list = new JList(model = new DefaultListModel());
				
				list.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						if (e.getClickCount() == 2){
							JOptionPane.showMessageDialog(GUI.this, "selektierter Index: " + list.getSelectedIndex());
						}
					}
				});
				
				list.setCellRenderer(new DefaultListCellRenderer() {
					
					private JProgressBar	bar	= new JProgressBar();
					private JLabel 			label = new JLabel();
					private JPanel 			panel = initPanel();
					
					private Color defaultForground = bar.getForeground();
					private Color defaultBackground = bar.getBackground();					
					
					private JPanel initPanel() {
						JPanel panel = new JPanel(new BorderLayout());
						
						panel.add(label, 	BorderLayout.WEST);
						panel.add(bar, 		BorderLayout.CENTER);
						
						return panel;
					}

					public Component getListCellRendererComponent(JList list, final Object value, int index, boolean isSelected, boolean cellHasFocus) {
						/*
						 * Da wir dem Model nun nicht mehr einfache Werte übergeben (0-100) sondern ein
						 * Objekt, müssen wir die Variable "value" casten.
						 */
						ServerClientObject sco = (ServerClientObject) value;
						
						bar.setValue(sco.getProgress());
						bar.setStringPainted(true);
						
						label.setText(sco.getAddress());
						
						if (isSelected){
							bar.setForeground(Color.RED);
							bar.setBackground(new Color(255,200,200));
						}else{
							bar.setForeground(defaultForground);
							bar.setBackground(defaultBackground);
						}
						
						return panel;
					}
				});
				this.getContentPane().add(new JScrollPane(list));
				this.setBounds(0, 0, 200, 200);
				this.setLocationRelativeTo(null);
				this.setVisible(true);
			}

			public void addClient(ServerClientObject serverClientObject) {
				model.addElement(serverClientObject);
			}

			public void setStatus(int index, int status) {
				((ServerClientObject)model.getElementAt(index)).setProgress(status);
				list.validate();
				list.repaint();
			}
		}
		
		class ServerClientObject{
			private int progress;
			private String address;
			
			public ServerClientObject(int progress, String address) {
				this.progress = progress;
				this.address = address;
			}
			public void setProgress(int progress) {
				this.progress = progress;
			}
			public int getProgress() {
				return this.progress;
			}
			public void setAddress(String address) {
				this.address = address;
			}
			public String getAddress() {
				return this.address;
			}
		}
	}

	class Client {
		public void start() throws Exception, IOException {
			final Socket socket = new Socket("127.0.0.1", 5555);
			final PrintWriter writer = new PrintWriter(socket.getOutputStream());
			
			new Thread(new Runnable() {
				int	status	= 0;

				public void run() {
					while (status <= 100) {
						try {
							Thread.sleep((long) (Math.random() * 5000));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						writer.println(status);
						writer.flush();
						status += 10;
					}
				}
			}).start();
		}
	}

	public static void main(String[] args) {
		new ServerClientDemo();
	}
}
 

jabbaDUH

Mitglied
Meru, danke ;)

ich will euch hier ja nicht nerven oder euch von wichtigeren Sachen abhalten, aber jetzt bin ich fast am Ende mit dem Teil.
Das einzige was ich noch hinkriegen möchte ist, dass statt dem Dialog beim Doppelklick auf die JProgressbar sich ein neues Fenster öffnet und je nach dem was ich noch an Informationen vom Client bekomme diese Informationen angezeigt werden.

Als Beispiel nehme ich mal die MAC Adresse, die der Client ebenfalls liefert. Beim Doppelklick sollte sich nun ein eigenes Fenster öffnen, in dem einfach auf nem Label die MAC ausgegeben wird.
Der Wert (Mac) wir vom Server über
Java:
while ((in = reader.readLine()) != null){..}
eingelesen.
Danach nehm ich diesen String auseinander und habe zb status (für die Progressbar) und die Mac adresse in einzelnen variablen vorliegen.

Um nun weiter zu kommen muss ich bestimmt auch wieder eine eigene Klasse erzeugen, die die Werte in Objekte zusammenfasst? Irgendwie ist dieses Objekt geschaufel noch recht undurchsichtig für mich. Ich könnte zusätzliche Werte (in einem Objekt) durch die GUI Klasse "durchreichen", um diese dann in einer 2. GUI zu benutzen. Sehe ich das richtig?

verwirrte Grüße
 
Zuletzt bearbeitet:

jabbaDUH

Mitglied
Hallo Forum,

ich will nich pushen, aber nur mal zur Verständlichkeit:
ich komm im Mouselistenener

Java:
list.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					
					JOptionPane.showMessageDialog(GUI.this.list,
							"selektierter Index: " + list.getSelectedIndex());
					
					
					
				}
			}
		});

nicht an die Objekte / das Objekt des

Java:
public Component getListCellRendererComponent(JList list,
					final Object value, int index, boolean isSelected,
					boolean cellHasFocus) {...}

weil ich da ja erst das Objekt übergebe... der listener sitzt allerdings ausserhalb..

versteht einer was ich meine? ;) bin nicht so gut in Probleme beschreiben =)


Danke schon mal
 

jabbaDUH

Mitglied
habs hinbekommen ;)

Vielen, vielen Dank an Meru und an Michael... und alle die sich evtl Gedanken drum gemacht haben ;)

Ich hab in diesem Thread viel gelernt und gemerkt, dass mit einfach Grundlagen fehlen, um "mal eben einfach" etwas in Java (vor allem in der GUI-Programmierung) zu erstellen.

Grüße jabbaDUH
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
T LookAndFeel L&F Citrix-Server-Client AWT, Swing, JavaFX & SWT 4
E Client-Server mittels AWT AWT, Swing, JavaFX & SWT 27
E Swing Server-Client OnlineListe AWT, Swing, JavaFX & SWT 4
S Client-Server-Applikation mit GUI - Bugs ausmerzen AWT, Swing, JavaFX & SWT 4
T Serversocket an Client Socket senden AWT, Swing, JavaFX & SWT 2
H Lust auf eine Open-Source Lösung für universelle Java Client-Technologie? AWT, Swing, JavaFX & SWT 11
D Serverdirectory auf Client browsen mit JFileChooser AWT, Swing, JavaFX & SWT 7
Rudolf JavaFx als Client und MySQL AWT, Swing, JavaFX & SWT 9
T Chat-Client AWT, Swing, JavaFX & SWT 15
F Applet vs Stand-Alone-Client AWT, Swing, JavaFX & SWT 3
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
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
J Server stellt sich hin AWT, Swing, JavaFX & SWT 13
A Applet Applet vom Web-Server aus aufrufen AWT, Swing, JavaFX & SWT 11
M AWT Datei auf server speichern und beschreiben AWT, Swing, JavaFX & SWT 7
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
H PopUp-Fenster in einer Java Server Faces Anwendung AWT, Swing, JavaFX & SWT 4
T Java Application auf X-Server ohne Windowmanager AWT, Swing, JavaFX & SWT 9
O Sicherung gegen nicht gefundenen DB Server AWT, Swing, JavaFX & SWT 2
bernd JTextPane und Server AWT, Swing, JavaFX & SWT 20
bernd UDP-Server AWT, Swing, JavaFX & SWT 3
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
P Swing Anwendung von LayeredPanel AWT, Swing, JavaFX & SWT 6
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
B JavaFX Wie A4-Seite in meiner Anwendung repräsentieren AWT, Swing, JavaFX & SWT 6
B JavaFX JavaFX Anwendung deployen (entw als runnableJAR oder exe-Datei) AWT, Swing, JavaFX & SWT 15
OSchriever Anwendung aus SystemTray öffnen AWT, Swing, JavaFX & SWT 29
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
T Anwendung mit X schliessen AWT, Swing, JavaFX & SWT 1
L JavaFX OpenJFX13 Anwendung exportieren AWT, Swing, JavaFX & SWT 7
D PDF Viewer in SWT-Anwendung AWT, Swing, JavaFX & SWT 8
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
A JavaFX Anwendung in Jar Datei AWT, Swing, JavaFX & SWT 8
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
J Splashscreen Start Anwendung AWT, Swing, JavaFX & SWT 14
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
L JavaFX LoadException beim Laden von JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
I JFileChooser mit System L&F bei anderem L&F der eigtl. Anwendung AWT, Swing, JavaFX & SWT 0
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
D JafaFX Anwendung beenden AWT, Swing, JavaFX & SWT 11
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
X Anwendung skalierbar AWT, Swing, JavaFX & SWT 3
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
D JavaFX Anwendung hängt sich permanent auf AWT, Swing, JavaFX & SWT 6
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
X Swing Anwendung regaiert auf keine Buttons mehr wärend while(scanner.hasNextLine()) ausgeführt wird. AWT, Swing, JavaFX & SWT 4
I Variabeln speichern in Desktop Anwendung AWT, Swing, JavaFX & SWT 2
V Anwendung im Vollbild zentrieren AWT, Swing, JavaFX & SWT 13
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
GreyFox JLabel in laufender Anwendung erzeugen AWT, Swing, JavaFX & SWT 6
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
K 3D-Grafik Anwendung von Java in Gnuplot AWT, Swing, JavaFX & SWT 3
M SWT Anwendung in der Symbolleiste verstecken AWT, Swing, JavaFX & SWT 5
B SWT Redesign SWT Anwendung AWT, Swing, JavaFX & SWT 7
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
VfL_Freak Swing Zweiter Monitor von Java-Anwendung ansprechbar ?? AWT, Swing, JavaFX & SWT 2
S Swing Ist meine gute Java Anwendung vorgängig? AWT, Swing, JavaFX & SWT 20
P Klassenaufbau bei komplexerer GUI Anwendung AWT, Swing, JavaFX & SWT 14
S Java GUI Anwendung ohne Konsole starten AWT, Swing, JavaFX & SWT 6
qwerqer Swing Anwendung soll blinken (Taskleiste) AWT, Swing, JavaFX & SWT 3
R Java Desktop Anwendung erstellen. Womit? AWT, Swing, JavaFX & SWT 3
eLogic Fullscreen anwendung aus der man nicht rauskommt AWT, Swing, JavaFX & SWT 37
T Java-Anwendung arbeitet Programm in seltsamer Reihenfolge ab AWT, Swing, JavaFX & SWT 3
H Anwendung schließen ohne System.exit AWT, Swing, JavaFX & SWT 5
R Anwendung ohne Symbol in der Taskleiste AWT, Swing, JavaFX & SWT 3
H SWT RAP Anwendung - Tabelle - Theming AWT, Swing, JavaFX & SWT 3
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
C Swing Eine SWING-Anwendung mittels MVC AWT, Swing, JavaFX & SWT 4
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
B SWT Hello World-Anwendung mit GUI in Eclipse -Problem mit Import von SWT AWT, Swing, JavaFX & SWT 9
G Applet und Swing Anwendung AWT, Swing, JavaFX & SWT 2
F Anwendung auf Teskleiste legen AWT, Swing, JavaFX & SWT 3
B MDI Anwendung alle maximierten InternalFrames in Tabs AWT, Swing, JavaFX & SWT 3
T Anwendung starten AWT, Swing, JavaFX & SWT 5
J Anwendung von Swing nach SWT bzw. Eclipse portieren AWT, Swing, JavaFX & SWT 3
2 Tablet-PC Java-Anwendung -> Tablet-Pen Problem !! AWT, Swing, JavaFX & SWT 3
J Swing Anwendung schließen im Listener AWT, Swing, JavaFX & SWT 3
isowiz Vorteil einer RCP Anwendung gegenüber Swing AWT, Swing, JavaFX & SWT 3
? Java-SWT-Anwendung in der Taskleiste nicht sichtbar AWT, Swing, JavaFX & SWT 6
H Netbeans-Anwendung schliessen AWT, Swing, JavaFX & SWT 8
M "Billig Excel" Anwendung mit Swing - Aufwand ? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben