Swing Stehe auf dem Schlauch...(BufferedReader_Writer-Fehler?)

Seikuassi

Aktives Mitglied
Hallo Forum-Nutzer,

habe (hoffentlich) einen simplen BufferedReader- oder BufferedWriter-Fehler.
Funktion des Programms ist eigentlich ganz einfach:Es erscheint eine Konsole (mit Swing kreiert), in der man beim Server den Port und die Puffergroesse der BufferedReader und BufferedWriter eingeben muss. Nach dem Verbinden kann man dann in einem weiteren Textfeld, das vorher deaktiviert war, Nachrichten (Strings) schicken. Im "Monitor" werden eingehende und abgehende Nachrichten angezeigt.
Die Nachrichten werden auch auf dem Monitor angezeigt, aber nicht verschickt/empfangen.

Meiner Fehlerdiagnose nach, spinnt BufferedReader. Er liest nichts...

Frage:Woran liegt das?
Ich weiß eigentlich, dass dieses Forum kein "Hausaufgaben-Löser" ist. Doch ich hatte schon vorher mit DataInputStream und DataOutputStream etwa das gleiche Programm in der Konsole geschrieben und dort funktionierte es. Es ist wahrscheinlich ein einfacher Fehler...:noe:

Server.java
Java:
package classes;

import java.applet.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.*;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;

// --- Hauptklasse --- //
class Server{
	// --- Klassen --- //
	
	// --- Methoden --- //
	public static void error_report(Exception exc0){
		try{
			PrintWriter out=new PrintWriter("/error_report.txt"); // Datei erstellen
			
			exc0.printStackTrace(out); // Fehler schreiben
			out.close(); // Datei schliessen
		}catch(Exception exc1){
			exc1.printStackTrace();
		}
		return;
	}
	public static void main(String[]arg){
			SwingUtilities.invokeLater(new Runnable(){
				public void run(){
					try{
						main_Frame=new Window("Server",800,600); // Fenster erzeugen
						
						main_Frame.create_Controls(); // Steuerelemente erstellen
						main_Frame.setVisible(true); // Fenster sichtbar machen
					}catch(Exception e){
						JOptionPane.showMessageDialog(main_Frame,(Object)e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE); // Fehler anzeigen
						System.exit(-1); // Programm mit Fehlercode beenden
					}finally{
						System.gc(); // Garbage Collector
					}
				}
			});
		return;
	}
	// --- Variablen --- //
	public static Window main_Frame;
	public static Receiver RC;
	public static Socket socket;
	public static ServerSocket Ssocket;
	public static Transmitter TM;
	// --- Aufzaehlungen --- //
	
}

// --- Klassen --- //
class Receiver extends Thread{
	Receiver(int BufferSize)throws Exception{
		this.in=new BufferedReader(new InputStreamReader(Server.socket.getInputStream()),BufferSize);
	}
	// --- Klassen --- //
	
	// --- Methoden --- //
	@Override public void run(){
		while(true){
			try{
				this.buffer=this.in.readLine(); // Nachrichten abhoeren und speichern
				Server.main_Frame.print_monitor('<'+this.buffer); // Nachricht auf Konsole ausgeben
			}catch(SocketException exc0){ // wenn die Verbindung getrennt wurde
				try{
					Server.main_Frame.print_monitor("Receiver is closed...");
					Server.main_Frame.print_monitor("Transmitter is closed...");
					this.in.close();
					Server.TM.out.close();
				}catch(SocketException exc1){ // wenn Verbindung getrennt wurde
					return;
				}catch(Exception exc1){
					Server.error_report(exc1); // Fehler ausgeben
					System.exit(-1); // Programm mit Fehlercode beenden
				}
				return;
			}catch(EOFException exc){
				Server.main_Frame.maco.connect_Button.doClick();
				Server.main_Frame.print_monitor("Connection closed.");
				return;
			}catch(Exception exc){
				Server.error_report(exc); // Fehler ausgeben
				System.exit(-1); // Programm mit Fehlercode beenden
			}
		}
	}
	// --- Variablen --- //
	private volatile String buffer="";
	private BufferedReader in;
	// --- Aufzahelungen --- //
	
}
class Transmitter extends Thread{
	Transmitter(int BufferSize)throws Exception{
		this.out=new BufferedWriter(new OutputStreamWriter(Server.socket.getOutputStream()),BufferSize);
	}
	// --- Klassen --- //
	
	// --- Methoden --- //
	@Override public void run(){
		while(true){
			try{
				while(this.buffer.equals("")==true){ // solange Puffer leer ist
					this.sleep(500); // 500 Millisekunden warten
				}
				this.out.write(this.buffer,0,this.buffer.length()); // Pufferinhalt senden
				this.out.newLine(); // Absatz hinzufuegen
				Server.main_Frame.print_monitor('>'+this.buffer); // Nachricht auf Konsole ausgeben
				this.buffer=""; // Puffer loeschen
			}catch(SocketException exc){ // wenn Verbindung getrennt wurde
				return;
			}catch(EOFException exc){
				System.exit(0); // Programm beenden
			}catch(Exception exc){
				Server.error_report(exc); // Fehler ausgeben
				System.exit(-1); // Programm mit Fehlercode beenden
			}
		}
	}
	// --- Variablen --- //
	public volatile String buffer="";
	public BufferedWriter out;
	// --- Aufzahelungen --- //
	
}
class Window extends JFrame{
	Window(String title,int width,int height)throws Exception{
		if(height>0||width>0){
			{ // Fenstereinstellungen festlegen
				this.setTitle(title); // Fenstertitel festlegen
				this.setIconImage(ImageIO.read(getClass().getResource("/resources/network.png"))); // Icon laden und anzeigen
				this.setDefaultCloseOperation(EXIT_ON_CLOSE); // beim Schliessen des Fensters, soll das Programm beendet werden
				this.setPreferredSize(new Dimension(width,height)); // Fenstergroesse festlegen
				this.pack();
				this.setResizable(false); // Fenstergroesse kann nicht veraendert werden
				this.setLocationRelativeTo(null); // Fenster zentrieren
			}
			this.height=height;
			this.width=width;
		}else{
			throw new Exception("Invalid height or/and width."); // Ausnahme werfen
		}
	}
	// --- Klassen --- //
	class ActionLi implements ActionListener{
		// --- Klassen --- //
		
		// --- Methoden --- //
		@Override public void actionPerformed(ActionEvent e){
			if(e.getSource()==maco.connect_Button){ // wenn der "Connect"-Button gedrueckt wurde
				if(this.connected==false){ // wenn noch keine Verbindung aufgebaut wurde
					clear_monitor(); // Konsole loeschen
					lock_settings_input(); // Optionseingaben sperren
					if(connect()==true){ // wenn kein Fehler beim Verbinden aufgetreten ist
						maco.connect_Button.setForeground(Color.WHITE); // Vordergrundfarbe (weiss) festlegen
						maco.connect_Button.setBackground(Color.RED); // Hintergundfarbe (rot) festlegen
						maco.connect_Button.setText("Disconnect"); // Text festlegen
						this.connected=true;
					}else{
						unlock_settings_input(); // Optionseingaben entsperren
					}
				}else{ // wenn bereits eine Verbindung besteht
					disconnect();
					unlock_settings_input(); // Optionseingaben entsperren
					maco.connect_Button.setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
					maco.connect_Button.setBackground(Color.GREEN); // Hintergundfarbe (gruen) festlegen
					maco.connect_Button.setText("Connect"); // Text festlegen
					this.connected=false;
				}
			}
			return;
		}
		// --- Variablen --- //
		public boolean connected=false;
		// --- Aufzaehlungen --- //
		
	}
	class KeyLi extends KeyAdapter{
		// --- Klassen --- //
		
		// --- Methoden --- //
		@Override public void keyPressed(KeyEvent e){
			if(e.getSource()==maco.input&&e.getKeyCode()==KeyEvent.VK_ENTER){ // wenn im Eingabefeld die Enter-Taste gedrueckt wurde
				if(maco.input.getText().equals("")==false){ // wenn keine leere Zeichenkette vorhanden ist
					Server.TM.buffer=maco.input.getText(); // Eingabe senden
					maco.input.setText(""); // Eingabefeld leeren
				}
			}
			return;
		}
		// --- Variablen --- //
		
		// --- Aufzaehlungen --- //
		
	}
	class WindowLi extends WindowAdapter{
		// --- Klassen --- //
		
		// --- Methoden --- //
		@Override public void windowClosed(WindowEvent e){
			if(Server.Ssocket!=null){ // wenn noch eine Socket-Verbindung besteht
				disconnect(); // Verbindung beenden
			}
			return;
		}
		// --- Variablen --- //
		
		// --- Aufzaehlungen --- //
		
	}
	// --- Methoden --- //
	public void clear_monitor(){
		this.maco.monitor.setText(""); // Konsole loeschen
		return;
	}
	private boolean connect(){
		String[]text_content={new String(),new String()};
		
		text_content[0]=this.maco.settings_input[0].getText(); // Port
		text_content[1]=this.maco.settings_input[1].getText(); // Puffergroesse
		if(text_content[0].isEmpty()==false&&text_content[1].isEmpty()==false){
			try{
				int[]values={Integer.valueOf(text_content[0]),Integer.valueOf(text_content[1])};
				
				if(values[1]>0){ // wenn alle Eingaben gueltig sind
					Server.Ssocket=new ServerSocket(values[0]); // ServerSocket erstellen
					Server.Ssocket.setSoTimeout(5000); // Timeout (5 Sekunden) festlegen
					Server.socket=Server.Ssocket.accept(); // auf Client warten
					this.print_monitor("Connected to client \""+Server.socket.getRemoteSocketAddress()+"\"."); // Status ausgeben
					Server.RC=new Receiver(values[1]*1024);
					Server.RC.start(); // Empfaenger starten
					Server.TM=new Transmitter(values[1]*1024);
					Server.TM.start(); // Sender starten
				}else{ // wenn Eingaben ungueltig sind
					this.print_monitor("Error:Buffer size must be greater than 0."); // Fehler ausgeben
					return false;
				}
			}catch(SocketTimeoutException exc){ // wenn das Timeout ueberschritten wurde
				this.print_monitor("Error:Client not responding."); // Fehler ausgeben
				return false;
			}catch(NumberFormatException exc){ // wenn keine Zahl eingegeben wurde (Port und Puffergroesse)
				this.print_monitor("Error:Invalid number input."); // Fehler ausgeben
				return false;
			}catch(IllegalArgumentException exc){ // wenn die Portnummer ungueltig ist (<0 oder >65535)
				this.print_monitor("Error:Port must between 0 and 65535."); // Fehler ausgeben
				return false;
			}catch(Exception exc){
				this.print_monitor("Error:"+exc.getMessage()+"."); // Fehler ausgeben
				return false;
			}finally{
				if(Server.Ssocket!=null){ // wenn ServerSocket noch besteht
					try{
						Server.Ssocket.close(); // Verbindung schliessen
						Server.Ssocket=null;
					}catch(Exception exc){
						Server.error_report(exc); // Fehler ausgeben
						System.exit(-1); // Programm mit Fehlercode beenden
					}
				}
			}
		}else{ // wenn Eingaben fehlen
			this.print_monitor("Error:Options inclomplete. Check inputs."); // Fehler ausgeben
			return false;
		}
		return true;
	}
	public void create_Controls(){
		{ // Ueberschrift
			this.maco.heading.setFont(new Font(Font.DIALOG,Font.BOLD,20)); // Schriftart festlegen
			this.maco.heading.setForeground(Color.YELLOW); // Schriftfarbe (gelb) festlegen
			this.maco.heading.setText("<html><u>Server</u></html>"); // Text festlegen
			this.maco.heading.setHorizontalAlignment(JLabel.CENTER); // zentrieren
			this.maco.heading.setBounds(0,10,this.width,25); // Position und Groesse festlegen
			this.maco.heading.setVisible(true); // Ueberschrift sichtbar machen
			this.maco.surface.add(this.maco.heading); // Ueberschrift der Oberflaeche hinzufuegen
		}
		{ // Einstellungstext
			this.maco.settings_label.setFont(this.maco.std_Font2); // Schriftart festlegen
			this.maco.settings_label.setForeground(Color.WHITE); // Vordergundfarbe (weiss) festlegen
			this.maco.settings_label.setText("Optionen"); // Text festlegen
			this.maco.settings_label.setBounds(25,485,200,25); // Position und Groesse festlegen
			this.maco.settings_label.setVisible(true); // Einstellungstext sichtbar machen
			this.maco.surface.add(this.maco.settings_label); // Einstellungstext der Oberflaeche hinzufuegen
		}
		{ // Eingabefelder fuer Einstellungen
			{ // Portnummer-Eingabefeld-Ueberschrift
				this.maco.settings_heading[0].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_heading[0].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_heading[0].setText("Port");
				this.maco.settings_heading[0].setBounds(50,510,75,20); // Position und Groesse festlegen
				this.maco.settings_heading[0].setVisible(true); // Portnummer-Eingabefeld-Ueberschrift sichtbar machen
				this.maco.surface.add(this.maco.settings_heading[0]); // Portnummer-Eingabefeld-Ueberschrift der Oberflaeche hinzufuegen
			}
			{ // Portnummer-Eingabefeld
				this.maco.settings_input[0].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_input[0].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_input[0].setBackground(Color.WHITE); // Hintergrundfarbe (weiss) festlegen
				this.maco.settings_input[0].setBounds(50,530,75,20); // Position und Groesse festlegen
				this.maco.settings_input[0].setVisible(true); // Portnummer-Eingabefeld sichtbar machen
				this.maco.surface.add(this.maco.settings_input[0]); // Portnummer-Eingabefeld der Oberflaeche hinzufuegen
			}
			{ // Puffergroesse-Eingabefeld-Ueberschrift
				this.maco.settings_heading[1].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_heading[1].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_heading[1].setText("Puffergroesse (kB)"); // Text festlegen
				this.maco.settings_heading[1].setBounds(150,510,100,20); // Position und Groesse festlegen
				this.maco.settings_heading[1].setVisible(true); // Puffergroesse-Eingabefeld-Ueberschrift sichtbar machen
				this.maco.surface.add(this.maco.settings_heading[1]); // Puffergroesse-Eingabefeld-Ueberschrift der Oberflaeche hinzufuegen
			}
			{ // Puffergroesse-Eingabefeld
				this.maco.settings_input[1].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_input[1].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_input[1].setBackground(Color.WHITE); // Hintergrundfrabe (weiss) festlegen
				this.maco.settings_input[1].setBounds(150,530,100,20); // Position und Groesse festlegen
				this.maco.settings_input[1].setVisible(true); // Puffergroesse-Eingabefeld sichtbar machen
				this.maco.surface.add(this.maco.settings_input[1]); // Puffergroesse-Eingabefeld der Oberflaeche hinzufuegen
			}
		}
		{ // "Connect"-Button
			this.maco.connect_Button.addActionListener(this.ActLi); // ActionListener hinzufuegen
			this.maco.connect_Button.setFont(this.maco.std_Font); // Schriftart festlegen
			this.maco.connect_Button.setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
			this.maco.connect_Button.setBackground(Color.GREEN); // Hintergrundfarbe (gruen) festlegen
			this.maco.connect_Button.setText("Connect"); // Text festlegen
			this.maco.connect_Button.setBounds(450,520,100,20); // Position und Groesse festlegen
			this.maco.connect_Button.setVisible(true); // "Connect"-Button sichtbar machen
			this.maco.surface.add(this.maco.connect_Button); // "Connect"-Button der Oberflaeche hinzufuegen
		}
		{ // "Monitor"
			{ // "Monitor"-Textfeld
				this.maco.monitor.setLineWrap(true); // automatischer Zeilenunmbruch aktiviert
				this.maco.monitor.setWrapStyleWord(true);
				this.maco.monitor.setEditable(false); // Textfeld darf vom Benutzer nicht editiert werden, solange die Einstellungen nicht festgelegt wurden
				this.maco.monitor.setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.monitor.setForeground(Color.WHITE); // Vordergundfarbe (weiss) festlegen
				this.maco.monitor.setBackground(Color.BLACK); // Hintergrundfarbe (schwarz) festlegen
			}
			{ // "Monitor"-Scrollbar
				this.maco.monitor_scrollbar=new JScrollPane(this.maco.monitor); // Scrollbar dem "Monitor" hinzufuegen
				this.maco.monitor_scrollbar.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); // horizontaler Scrollbalken nie anzeigen
				this.maco.monitor_scrollbar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); // vertikaler Scrollbalken immer anzeigen
				this.maco.monitor_scrollbar.setBackground(Color.WHITE); // Farbe (weiss) festlegen
				this.maco.monitor_scrollbar.setBounds(this.width/2-650/2,35,650,400); // Position und Groesse festlegen
				this.maco.monitor_scrollbar.setVisible(true); // "Monitor"-Scrollbar sichtbar machen
				this.add(this.maco.monitor_scrollbar); // Scrollbar und "Monitor" dem Fenster hinzufuegen
			}
		}
		{ // Eingabefeld
			this.maco.input.addKeyListener(this.KLi); // KeyListener hinzufuegen
			this.maco.input.setEditable(false); // Eingabefeld darf nicht benutzt werden, solange keine Verbindung besteht
			this.maco.input.setFont(this.maco.std_Font); // Schriftart festlegen
			this.maco.input.setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
			this.maco.input.setBackground(this.maco.disabled_color); // Hintergrundfarbe (disabled_color) festlegen
			this.maco.input.setBounds(this.width/2-650/2,450,650,25); // Position und Groesse festlegen
			this.maco.input.setVisible(true); // Eingabefeld sichtbar machen
			this.maco.surface.add(this.maco.input); // Eingabefeld der Oberflaeche hinzufuegen
		}
		{ // Oberflaeche
			this.maco.surface.setLayout(null); // kein Layout verwenden
			this.maco.surface.setBackground(new Color(77,77,77)); // Hintergrundfarbe (dunkelgrau) festlegen
			this.maco.surface.setVisible(true); // Oberflaeche sichtbar machen
			this.add(this.maco.surface); // Oberflaeche dem Fenster hinzufuegen
		}
		return;
	}
	private void disconnect(){
		if(Server.socket!=null){ // wenn Socket-Verbindung noch besteht
			try{
				Server.socket.close(); // Socket schliessen
				Server.socket=null;
				if(Server.Ssocket!=null){ // wenn ServerSocket-Verbindung noch besteht
					Server.Ssocket.close(); // ServerSocket schliessen
					Server.Ssocket=null;
				}
				System.gc(); // Garbage Collector
			}catch(Exception exc){
				Server.error_report(exc); // Fehler ausgeben
				System.exit(-1); // Programm mit Fehlercode beenden
			}
		}
		return;
	}
	private void lock_settings_input(){
		for(byte i=0;i<this.maco.settings_input.length;i++){ // Optionseingabefelder sperren
			this.maco.settings_input[i].setEditable(false); // Eingaben sperren
			this.maco.settings_input[i].setBackground(this.maco.disabled_color); // Hintegrundfarbe (disabled_color) festlegen
		}
		this.maco.input.setEditable(true); // Eingabefeld entsperren
		this.maco.input.setBackground(Color.WHITE); // Hintergrundfarbe (weiss) festlegen
		return;
	}
	public void print_monitor(String text){
		this.maco.monitor.append(text+'\n');
		return;
	}
	private void unlock_settings_input(){
		for(byte i=0;i<this.maco.settings_input.length;i++){ // Optionseingabefelder entsperren
			this.maco.settings_input[i].setEditable(true); // Eingaben entsperren
			this.maco.settings_input[i].setBackground(Color.WHITE); // Hintegrundfarbe (weiss) festlegen
		}
		this.maco.input.setEditable(false); // Eingabefeld sperren
		this.maco.input.setBackground(this.maco.disabled_color); // Hintergrundfarbe (disabled_color) festlegen
		return;
	}
	// --- Variablen --- //
	public ActionLi ActLi=new ActionLi();
	private int height;
	private KeyLi KLi=new KeyLi();
	public Controls maco=new Controls();
	private int width;
	private WindowLi WinLi=new WindowLi();
	// --- Aufzaehlungen --- //
	
}

// --- Datenstrukturen --- //
class Controls{
	public Color background_color=new Color(77,77,77);
	public JButton connect_Button=new JButton();
	public Color disabled_color=new Color(179,179,179);
	public JLabel heading=new JLabel();
	public JTextField input=new JTextField();
	public volatile JTextArea monitor=new JTextArea();
	public JScrollPane monitor_scrollbar;
	public JTextField[]settings_input={new JTextField(),new JTextField()};
	public JLabel[]settings_heading={new JLabel(),new JLabel()};
	public JLabel settings_label=new JLabel();
	public Font std_Font=new Font(Font.DIALOG,Font.PLAIN,10);
	public Font std_Font2=new Font(Font.DIALOG,Font.BOLD,14);
	public JPanel surface=new JPanel();
}

Client.java
s. nächste Antwort

Ich hoffe meine Programmstruktur geht euch nicht zu sehr auf die Nerven...😳

Ich wäre dankbar für jede Hilfe!

Mit freundlichen Grüßen
Seikuassi
 
Zuletzt bearbeitet:
Platz zu gering gewesen...

Client.java:

Java:
package classes;

import java.applet.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.*;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;

// --- Hauptklasse --- //
class Client{
	// --- Klassen --- //
	
	// --- Methoden --- //
	public static void error_report(Exception exc0){
		try{
			PrintWriter out=new PrintWriter("/error_report.txt"); // Datei erstellen
			
			exc0.printStackTrace(out); // Fehler schreiben
			out.close(); // Datei schliessen
		}catch(Exception exc1){
			exc1.printStackTrace();
		}
		return;
	}
	public static void main(String[]arg){
			SwingUtilities.invokeLater(new Runnable(){
				public void run(){
					try{
						main_Frame=new Window("Client",800,600); // Fenster erzeugen
						
						main_Frame.create_Controls(); // Steuerelemente erstellen
						main_Frame.setVisible(true); // Fenster sichtbar machen
					}catch(Exception e){
						JOptionPane.showMessageDialog(main_Frame,(Object)e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE); // Fehler anzeigen
						System.exit(-1); // Programm mit Fehlercode beenden
					}finally{
						System.gc(); // Garbage Collector
					}
				}
			});
		return;
	}
	// --- Variablen --- //
	public static Window main_Frame;
	public static Receiver RC;
	public static Socket socket;
	public static Transmitter TM;
	// --- Aufzaehlungen --- //
	
}

// --- Klassen --- //
class Receiver extends Thread{
	Receiver(int BufferSize)throws Exception{
		this.in=new BufferedReader(new InputStreamReader(Client.socket.getInputStream()),BufferSize);
	}
	// --- Klassen --- //
	
	// --- Methoden --- //
	@Override public void run(){
		while(true){
			try{
				this.buffer=this.in.readLine(); // Nachrichten abhoeren und speichern
				Client.main_Frame.print_monitor('<'+this.buffer); // Nachricht auf Konsole ausgeben
				this.buffer=""; // Puffer loeschen
			}catch(SocketException exc0){ // wenn die Verbindung getrennt wurde
				try{
					Client.main_Frame.print_monitor("Receiver is closed...");
					Client.main_Frame.print_monitor("Transmitter is closed...");
					this.in.close();
					Client.TM.out.close();
				}catch(SocketException exc1){ // wenn Verbindung getrennt wurde
					return;
				}catch(Exception exc1){
					Client.error_report(exc1); // Fehler ausgeben
					System.exit(-1); // Programm mit Fehlercode beenden
				}
				return;
			}catch(EOFException exc){
				System.exit(0); // Programm beenden
			}catch(Exception exc){
				Client.error_report(exc); // Fehler ausgeben
				System.exit(-1); // Programm mit Fehlercode beenden
			}
		}
	}
	// --- Variablen --- //
	private volatile String buffer="";
	private BufferedReader in;
	// --- Aufzahelungen --- //
	
}
class Transmitter extends Thread{
	Transmitter(int BufferSize)throws Exception{
		this.out=new BufferedWriter(new OutputStreamWriter(Client.socket.getOutputStream()),BufferSize);
	}
	// --- Klassen --- //
	
	// --- Methoden --- //
	@Override public void run(){
		while(true){
			try{
				while(this.buffer.equals("")==true){ // solange Puffer leer ist
					this.sleep(500); // 500 Millisekunden warten
				}
				this.out.write(this.buffer,0,this.buffer.length()); // Pufferinhalt senden
				Client.main_Frame.print_monitor('>'+this.buffer); // Nachricht auf Konsole ausgeben
				this.buffer=""; // Puffer loeschen
			}catch(SocketException exc){ // wenn Verbindung getrennt wurde
				return;
			}catch(EOFException exc){
				System.exit(0); // Programm beenden
			}catch(Exception exc){
				Client.error_report(exc); // Fehler ausgeben
				System.exit(-1); // Programm mit Fehlercode beenden
			}
		}
	}
	// --- Variablen --- //
	public volatile String buffer="";
	public BufferedWriter out;
	// --- Aufzahelungen --- //
	
}
class Window extends JFrame{
	Window(String title,int width,int height)throws Exception{
		if(height>0||width>0){
			{ // Fenstereinstellungen festlegen
				this.setTitle(title); // Fenstertitel festlegen
				this.setIconImage(ImageIO.read(getClass().getResource("/resources/network.png"))); // Icon laden und anzeigen
				this.setDefaultCloseOperation(EXIT_ON_CLOSE); // beim Schliessen des Fensters, soll das Programm beendet werden
				this.setPreferredSize(new Dimension(width,height)); // Fenstergroesse festlegen
				this.pack();
				this.setResizable(false); // Fenstergroesse kann nicht veraendert werden
				this.setLocationRelativeTo(null); // Fenster zentrieren
			}
			this.height=height;
			this.width=width;
		}else{
			throw new Exception("Invalid height or/and width."); // Ausnahme werfen
		}
	}
	// --- Klassen --- //
	class ActionLi implements ActionListener{
		// --- Klassen --- //
		
		// --- Methoden --- //
		@Override public void actionPerformed(ActionEvent e){
			if(e.getSource()==maco.connect_Button){ // wenn der "Connect"-Button gedrueckt wurde
				if(this.connected==false){ // wenn noch keine Verbindung aufgebaut wurde
					clear_monitor(); // Konsole loeschen
					lock_settings_input(); // Optionseingaben sperren
					if(connect()==true){ // wenn kein Fehler beim Verbinden aufgetreten ist
						maco.connect_Button.setForeground(Color.WHITE); // Vordergrundfarbe (weiss) festlegen
						maco.connect_Button.setBackground(Color.RED); // Hintergundfarbe (rot) festlegen
						maco.connect_Button.setText("Disconnect"); // Text festlegen
						this.connected=true;
					}else{
						unlock_settings_input(); // Optionseingaben entsperren
					}
				}else{ // wenn bereits eine Verbindung besteht
					disconnect();
					unlock_settings_input(); // Optionseingaben entsperren
					maco.connect_Button.setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
					maco.connect_Button.setBackground(Color.GREEN); // Hintergundfarbe (gruen) festlegen
					maco.connect_Button.setText("Connect"); // Text festlegen
					this.connected=false;
				}
			}
			return;
		}
		// --- Variablen --- //
		public boolean connected=false;
		// --- Aufzaehlungen --- //
		
	}
	class KeyLi extends KeyAdapter{
		// --- Klassen --- //
		
		// --- Methoden --- //
		@Override public void keyPressed(KeyEvent e){
			if(e.getSource()==maco.input&&e.getKeyCode()==KeyEvent.VK_ENTER){ // wenn im Eingabefeld die Enter-Taste gedrueckt wurde
				if(maco.input.getText().equals("")==false){ // wenn keine leere Zeichenkette vorhanden ist
					Client.TM.buffer=maco.input.getText(); // Eingabe senden
					maco.input.setText(""); // Eingabefeld leeren
				}
			}
			return;
		}
		// --- Variablen --- //
		
		// --- Aufzaehlungen --- //
		
	}
	class WindowLi extends WindowAdapter{
		// --- Klassen --- //
		
		// --- Methoden --- //
		@Override public void windowClosed(WindowEvent e){
			if(Client.socket!=null){ // wenn noch eine Socket-Verbindung besteht
				disconnect(); // Verbindung beenden
			}
			return;
		}
		// --- Variablen --- //
		
		// --- Aufzaehlungen --- //
		
	}
	// --- Methoden --- //
	public void clear_monitor(){
		this.maco.monitor.setText(""); // Konsole loeschen
		return;
	}
	private boolean connect(){
		String[]text_content={new String(),new String(),new String()};
		
		text_content[0]=this.maco.settings_input[0].getText(); // Port
		text_content[1]=this.maco.settings_input[1].getText(); // HostName
		text_content[2]=this.maco.settings_input[2].getText(); // Puffergroesse
		if(text_content[0].isEmpty()==false&&text_content[1].isEmpty()==false&&text_content[2].isEmpty()==false){
			try{
				int[]values={Integer.valueOf(text_content[0]),Integer.valueOf(text_content[2])};
				
				if(values[1]>0){ // wenn alle Eingaben gueltig sind
					InetSocketAddress InetAddress=new InetSocketAddress(text_content[1],values[0]); // Adresse definieren
					Client.socket=new Socket(); // Socket erstellen
					Client.socket.connect(InetAddress,1000); // Verbindung aufbauen, Timeout:1 Sekunde
					this.print_monitor("Connected to server \""+Client.socket.getRemoteSocketAddress()+"\"."); // Status ausgeben
					Client.RC=new Receiver(values[1]*1024);
					Client.RC.start(); // Empfaenger starten
					Client.TM=new Transmitter(values[1]*1024);
					Client.TM.start(); // Sender starten
				}else{ // wenn Eingaben ungueltig sind
					this.print_monitor("Error:Buffer size must be greater than 0."); // Fehler ausgeben
					return false;
				}
			}catch(SocketTimeoutException exc){ // wenn das Timeout ueberschritten wurde
				this.print_monitor("Error:Server not responding."); // Fehler ausgeben
				return false;
			}catch(NumberFormatException exc){ // wenn keine Zahl eingegeben wurde (Port und Puffergroesse)
				this.print_monitor("Error:Invalid number input."); // Fehler ausgeben
				return false;
			}catch(UnknownHostException exc){ // wenn der Host nicht existiert
				this.print_monitor("Error:Unknown Hostname."); // Fehler ausgeben
				return false;
			}catch(IllegalArgumentException exc){ // wenn die Portnummer ungueltig ist (<0 oder >65535)
				this.print_monitor("Error:Port must between 0 and 65535."); // Fehler ausgeben
				return false;
			}catch(Exception exc){
				this.print_monitor("Error:"+exc.getMessage()+"."); // Fehler ausgeben
				return false;
			}
		}else{ // wenn Eingaben fehlen
			this.print_monitor("Error:Options inclomplete. Check inputs."); // Fehler ausgeben
			return false;
		}
		return true;
	}
	public void create_Controls(){
		{ // Ueberschrift
			this.maco.heading.setFont(new Font(Font.DIALOG,Font.BOLD,20)); // Schriftart festlegen
			this.maco.heading.setForeground(Color.YELLOW); // Schriftfarbe (gelb) festlegen
			this.maco.heading.setText("<html><u>Client</u></html>"); // Text festlegen
			this.maco.heading.setHorizontalAlignment(JLabel.CENTER); // zentrieren
			this.maco.heading.setBounds(0,10,this.width,25); // Position und Groesse festlegen
			this.maco.heading.setVisible(true); // Ueberschrift sichtbar machen
			this.maco.surface.add(this.maco.heading); // Ueberschrift der Oberflaeche hinzufuegen
		}
		{ // Einstellungstext
			this.maco.settings_label.setFont(this.maco.std_Font2); // Schriftart festlegen
			this.maco.settings_label.setForeground(Color.WHITE); // Vordergundfarbe (weiss) festlegen
			this.maco.settings_label.setText("Optionen"); // Text festlegen
			this.maco.settings_label.setBounds(25,485,200,25); // Position und Groesse festlegen
			this.maco.settings_label.setVisible(true); // Einstellungstext sichtbar machen
			this.maco.surface.add(this.maco.settings_label); // Einstellungstext der Oberflaeche hinzufuegen
		}
		{ // Eingabefelder fuer Einstellungen
			{ // Portnummer-Eingabefeld-Ueberschrift
				this.maco.settings_heading[0].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_heading[0].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_heading[0].setText("Port");
				this.maco.settings_heading[0].setBounds(50,510,75,20); // Position und Groesse festlegen
				this.maco.settings_heading[0].setVisible(true); // Portnummer-Eingabefeld-Ueberschrift sichtbar machen
				this.maco.surface.add(this.maco.settings_heading[0]); // Portnummer-Eingabefeld-Ueberschrift der Oberflaeche hinzufuegen
			}
			{ // Portnummer-Eingabefeld
				this.maco.settings_input[0].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_input[0].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_input[0].setBackground(Color.WHITE); // Hintergrundfarbe (weiss) festlegen
				this.maco.settings_input[0].setBounds(50,530,75,20); // Position und Groesse festlegen
				this.maco.settings_input[0].setVisible(true); // Portnummer-Eingabefeld sichtbar machen
				this.maco.surface.add(this.maco.settings_input[0]); // Portnummer-Eingabefeld der Oberflaeche hinzufuegen
			}
			{ // HostName-Eingabefeld-Ueberschrift
				this.maco.settings_heading[1].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_heading[1].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_heading[1].setText("Hostname"); // Text festlegen
				this.maco.settings_heading[1].setBounds(150,510,150,20); // Position und Groesse festlegen
				this.maco.settings_heading[1].setVisible(true); // HostName-Eingabefeld-Ueberschrift sichtbar machen
				this.maco.surface.add(this.maco.settings_heading[1]); // HostName-Eingabefeld-Ueberschrift der Oberflaeche hinzufuegen
			}
			{ // HostName-Eingabefeld
				this.maco.settings_input[1].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_input[1].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_input[1].setBackground(Color.WHITE); // Hintergrundfarbe (weiss) festlegen
				this.maco.settings_input[1].setBounds(150,530,150,20); // Position und Groesse festlegen
				this.maco.settings_input[1].setVisible(true); // HostName-Eingabefeld sichtbar machen
				this.maco.surface.add(this.maco.settings_input[1]); // HostName-Eingabefeld der Oberflaeche hinzufuegen
			}
			{ // Puffergroesse-Eingabefeld-Ueberschrift
				this.maco.settings_heading[2].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_heading[2].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_heading[2].setText("Puffergroesse (kB)"); // Text festlegen
				this.maco.settings_heading[2].setBounds(325,510,100,20); // Position und Groesse festlegen
				this.maco.settings_heading[2].setVisible(true); // Puffergroesse-Eingabefeld-Ueberschrift sichtbar machen
				this.maco.surface.add(this.maco.settings_heading[2]); // Puffergroesse-Eingabefeld-Ueberschrift der Oberflaeche hinzufuegen
			}
			{ // Puffergroesse-Eingabefeld
				this.maco.settings_input[2].setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.settings_input[2].setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
				this.maco.settings_input[2].setBackground(Color.WHITE); // Hintergrundfrabe (weiss) festlegen
				this.maco.settings_input[2].setBounds(325,530,100,20); // Position und Groesse festlegen
				this.maco.settings_input[2].setVisible(true); // Puffergroesse-Eingabefeld sichtbar machen
				this.maco.surface.add(this.maco.settings_input[2]); // Puffergroesse-Eingabefeld der Oberflaeche hinzufuegen
			}
		}
		{ // "Connect"-Button
			this.maco.connect_Button.addActionListener(this.ActLi); // ActionListener hinzufuegen
			this.maco.connect_Button.setFont(this.maco.std_Font); // Schriftart festlegen
			this.maco.connect_Button.setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
			this.maco.connect_Button.setBackground(Color.GREEN); // Hintergrundfarbe (gruen) festlegen
			this.maco.connect_Button.setText("Connect"); // Text festlegen
			this.maco.connect_Button.setBounds(450,520,100,20); // Position und Groesse festlegen
			this.maco.connect_Button.setVisible(true); // "Connect"-Button sichtbar machen
			this.maco.surface.add(this.maco.connect_Button); // "Connect"-Button der Oberflaeche hinzufuegen
		}
		{ // "Monitor"
			{ // "Monitor"-Textfeld
				this.maco.monitor.setLineWrap(true); // automatischer Zeilenunmbruch aktiviert
				this.maco.monitor.setWrapStyleWord(true);
				this.maco.monitor.setEditable(false); // Textfeld darf vom Benutzer nicht editiert werden, solange die Einstellungen nicht festgelegt wurden
				this.maco.monitor.setFont(this.maco.std_Font); // Schriftart festlegen
				this.maco.monitor.setForeground(Color.WHITE); // Vordergundfarbe (weiss) festlegen
				this.maco.monitor.setBackground(Color.BLACK); // Hintergrundfarbe (schwarz) festlegen
			}
			{ // "Monitor"-Scrollbar
				this.maco.monitor_scrollbar=new JScrollPane(this.maco.monitor); // Scrollbar dem "Monitor" hinzufuegen
				this.maco.monitor_scrollbar.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); // horizontaler Scrollbalken nie anzeigen
				this.maco.monitor_scrollbar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); // vertikaler Scrollbalken immer anzeigen
				this.maco.monitor_scrollbar.setBackground(Color.WHITE); // Farbe (weiss) festlegen
				this.maco.monitor_scrollbar.setBounds(this.width/2-650/2,35,650,400); // Position und Groesse festlegen
				this.maco.monitor_scrollbar.setVisible(true); // "Monitor"-Scrollbar sichtbar machen
				this.add(this.maco.monitor_scrollbar); // Scrollbar und "Monitor" dem Fenster hinzufuegen
			}
		}
		{ // Eingabefeld
			this.maco.input.addKeyListener(this.KLi); // KeyListener hinzufuegen
			this.maco.input.setEditable(false); // Eingabefeld darf nicht benutzt werden, solange keine Verbindung besteht
			this.maco.input.setFont(this.maco.std_Font); // Schriftart festlegen
			this.maco.input.setForeground(Color.BLACK); // Vordergrundfarbe (schwarz) festlegen
			this.maco.input.setBackground(this.maco.disabled_color); // Hintergrundfarbe (disabled_color) festlegen
			this.maco.input.setBounds(this.width/2-650/2,450,650,25); // Position und Groesse festlegen
			this.maco.input.setVisible(true); // Eingabefeld sichtbar machen
			this.maco.surface.add(this.maco.input); // Eingabefeld der Oberflaeche hinzufuegen
		}
		{ // Oberflaeche
			this.maco.surface.setLayout(null); // kein Layout verwenden
			this.maco.surface.setBackground(new Color(77,77,77)); // Hintergrundfarbe (dunkelgrau) festlegen
			this.maco.surface.setVisible(true); // Oberflaeche sichtbar machen
			this.add(this.maco.surface); // Oberflaeche dem Fenster hinzufuegen
		}
		return;
	}
	private void disconnect(){
		if(Client.socket!=null){ // wenn Socket-Verbindung noch besteht
			try{
				Client.socket.close(); // Socket schliessen
				Client.socket=null;
				System.gc(); // Garbage Collector
			}catch(Exception exc){
				Client.error_report(exc); // Fehler ausgeben
				System.exit(-1); // Programm mit Fehlercode beenden
			}
		}
		return;
	}
	private void lock_settings_input(){
		for(byte i=0;i<this.maco.settings_input.length;i++){ // Optionseingabefelder sperren
			this.maco.settings_input[i].setEditable(false); // Eingaben sperren
			this.maco.settings_input[i].setBackground(this.maco.disabled_color); // Hintegrundfarbe (disabled_color) festlegen
		}
		this.maco.input.setEditable(true); // Eingabefeld entsperren
		this.maco.input.setBackground(Color.WHITE); // Hintergrundfarbe (weiss) festlegen
		return;
	}
	public void print_monitor(String text){
		this.maco.monitor.append(text+'\n');
		return;
	}
	private void unlock_settings_input(){
		for(byte i=0;i<this.maco.settings_input.length;i++){ // Optionseingabefelder entsperren
			this.maco.settings_input[i].setEditable(true); // Eingaben entsperren
			this.maco.settings_input[i].setBackground(Color.WHITE); // Hintegrundfarbe (weiss) festlegen
		}
		this.maco.input.setEditable(false); // Eingabefeld sperren
		this.maco.input.setBackground(this.maco.disabled_color); // Hintergrundfarbe (disabled_color) festlegen
		return;
	}
	// --- Variablen --- //
	private ActionLi ActLi=new ActionLi();
	private int height;
	private KeyLi KLi=new KeyLi();
	public Controls maco=new Controls();
	private int width;
	private WindowLi WinLi=new WindowLi();
	// --- Aufzaehlungen --- //
	
}

// --- Datenstrukturen --- //
class Controls{
	public Color background_color=new Color(77,77,77);
	public JButton connect_Button=new JButton();
	public Color disabled_color=new Color(179,179,179);
	public JLabel heading=new JLabel();
	public JTextField input=new JTextField();
	public volatile JTextArea monitor=new JTextArea();
	public JScrollPane monitor_scrollbar;
	public JTextField[]settings_input={new JTextField(),new JTextField(),new JTextField()};
	public JLabel[]settings_heading={new JLabel(),new JLabel(),new JLabel()};
	public JLabel settings_label=new JLabel();
	public Font std_Font=new Font(Font.DIALOG,Font.PLAIN,10);
	public Font std_Font2=new Font(Font.DIALOG,Font.BOLD,14);
	public JPanel surface=new JPanel();
}
 
Zuletzt bearbeitet:
Ohne mir jetzt den Code angeschaut zu haben ... wie kommst du zu deiner Fehlerdiagnose?

Probiere doch dein Problem auf ein KSKB runterzubrechen damit findet man Fehler dann meist selber, bzw. ist es leichter den Fehler zu finden.

EDIT: Ich lasse den Beitrag vorerst in diesem Bereich, würde ihn aber verschieben da du selbst glaubst das Problem hat nichts mit einer UI Komponente zu tun.
 
Zuletzt bearbeitet:
Hallo Joose,

bin damit einverstanden, dass du das Thema in den richtigen Bereich verschieben willst (Netzwerk o.ä.).
Kurze Frage zu Netzwerken, denn so kann ich den Client auf Fehler überprüfen:

Kennt Ihr einen Hostnamen für den Port 7 (Echo)? Bei "localhost" kann sich der Client bei mir nicht verbinden (Exception.getMessage()=="Verbindungsaufbau abgelehnt").
Welchen Hostnamen also?
 
Zuletzt bearbeitet:
// keine Problemlösung, nur Anmerkung //

Du scheinst die Thread-Kommunikation über die beiden

[Receiver] private volatile String buffer="";

sowie

[Transmitter] private volatile String buffer="";

durchzuführen, was v.a. einen 'atomic' Zugriff sicherstellt - aber nicht verhindert, dass evtl. mehrfach in den buffer geschrieben (und überschrieben) wird, bevor er gelesen wird (in seiner letzte Version). So können Inhalte verlorengehen. Besser wäre eine ArrayList<String> als (FIFO-)Warteschlange.
 
Zuletzt bearbeitet:

Zurück
Oben