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
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
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: