2016-04-24 12 views
-1

Mein Haupt unten Server Schleife funktioniert perfekt, wenn ich durch sie im Debug-Modus Schritt:Warum arbeitet der Java-Server mit einem JFrame im Debug-Modus, aber nicht im normalen Ausführungsmodus?

  • wenn die Starttaste der Server mit der Buchse beginnt gedrückt wird der Benutzer in das Textfeld ein und die Starttaste schrieb deaktiviert ist
  • , wenn der Server eine Nachricht beginnt, wird auf dem großen Textfeld, die den Hafen und die Adresse angezeigt, auf dem es läuft
  • , wenn ein Client eine Verbindung herstellt eine Meldung der Verbindung angezeigt wird angibt
  • den Server eingerichtet wurde nicht bekommen stecken in jeder anderen Schleife außer der Haupt, das ist erst dann verlassen, wenn der Benutzer

Aber wenn ich das Programm im normalen Modus laufen und der Startknopf gedrückt alles, was passiert ist, ist zu beenden wählt:

wird
  • der Startknopf
  • keine Nachrichten deaktiviert erscheint
  • Kunden nicht

Jede Hilfe dankbar an die angegebene Buchse anschließen können.

public class ServerLoop { 
    static boolean running; 
    static int currentState=0; 
    static int port; 
    static ServerSocket server = null; 

    public static void main (String[] args) throws IOException { 
     MainServer main = new MainServer(); 
     while (true) { 
      currentState = main.getCurrentState(); 
      switch (currentState) { 
      case 1: 
       port = main.getPortnumber(); 
       JTextArea text = main.getTextArea(); 
       String temp = text.getText(); 
       temp = temp + "Portnumber: "+ port +"\n" + 
        "Server ip-address: " + main.getIpAddress()+ "\n"; 
       main.updateText(temp); 
       server = new ServerSocket(port); 
       currentState++; 
       break; 

      case 2: 
       Socket clientConnection = server.accept(); 
       text = main.getTextArea(); 
       temp = text.getText(); 
       temp = temp + "Connection with: " + 
        clientConnection.getInetAddress().getHostName() + 
        "established. \n"; 
       main.updateText(temp); 
       new ClientConnected(clientConnection); 
       break; 

      case 3: 
       text = main.getTextArea(); 
       temp = text.getText(); 
       temp = temp + "Server shutting down...\n"; 
       main.updateText(temp); 
       server.close(); 
       text = main.getTextArea(); 
       temp = text.getText(); 
       temp = temp + "Server shutdown\n"; 
       main.updateText(temp); 
       main.setIdle(true); 
       currentState=0; 
       break; 

      default: 
       break; 
      } 
     } 
    } 
} 

Diese Klasse erstellt die Schnittstelle für den Server seine nur ein einfacher mit einem großen Textfeld, ein kleinen Textfeld und zwei Tasten mit den Hörern.

Wenn ich erraten muss die Server-Schleife und actionlisteners auf den Tasten, die einander hassen, aber ich verstehe nicht, warum es im Debug-Modus arbeitet.

public class MainServer extends JFrame { 
    JTextArea mainTextfield; 
    String k = ""; 
    JTextField portnumber; 
    JFrame frame; 
    JButton start,close; 
    int currentState = 0; 
    int porten; 
    boolean idle = true; 

    public MainServer() { 
     frame = new JFrame("ArenanServer v1.0"); 
     frame.setLayout(new FlowLayout()); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setSize(600, 550); 
     frame.setResizable(false); 
     frame.setBackground(Color.LIGHT_GRAY); 

     mainTextfield = new JTextArea(); 
     mainTextfield.setPreferredSize(new Dimension(585,450)); 
     mainTextfield.setBackground(Color.WHITE); 
     mainTextfield.setOpaque(true); 
     mainTextfield.setBorder(BorderFactory.createLoweredBevelBorder()); 
     mainTextfield.setEditable(false); 
     JScrollPane scroll = new JScrollPane(mainTextfield) 
     frame.add(scroll); 

     JLabel port = new JLabel(); 
     port.setText("Port: "); 
     frame.add(port); 

     portnumber = new JTextField(); 
     portnumber.setBorder(BorderFactory.createLoweredBevelBorder()); 
     portnumber.setPreferredSize(new Dimension(100,25)); 
     portnumber.setDocument(new JTextFieldLimit(5)); 
     frame.add(portnumber); 

     ////I think this might be a problem with the actionlisteners on buttons// 
     start = new JButton("Start server"); 
     close = new JButton("Close server"); 

     start.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (portnumber.getText().length()>0) { 
        porten = Integer.parseInt(portnumber.getText()); 
        start.setEnabled(false); 
        close.setEnabled(true); 
        currentState = 1; 
        idle=false; 
       } 
       else { 
        k = mainTextfield.getText(); 
        k = k + "Please enter a port number.\n"; 
        updateText(k); 
       } 
      } 
     }); 

    close.setEnabled(false); 
    close.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      currentState = 3; 
      start.setEnabled(true); 
      close.setEnabled(false); 
     } 
    }); 

    frame.add(start); 
    frame.add(close); 
    frame.setVisible(true); 
} 

Dies sind einige der Funktionen aus, die Kommunikation zwischen der Hauptschleife und der Schnittstellen sie in der gleichen Klasse wie die Grenzfläche platziert sind zu erhöhen.

protected JButton getStartButton() { 
    return start; 
} 
protected JButton getCloseButton() { 
    return close; 
} 
protected int getPortnumber() { 
    return porten; 
} 

protected JTextArea getTextArea() { 
    return mainTextfield; 
} 
protected JFrame getFrame() { 
    return frame; 
} 
protected boolean updateText(String l) { 
    mainTextfield.setText(l); 
    frame.repaint(); 
    if (mainTextfield.getText().equals(l)) { 
     return true; 
    } else { 
     return false; 
    } 
} 
protected boolean updateview() { 
    frame.repaint(); 
    return true; 
} 
protected int getCurrentState() { 
    if (idle) { 
     return 0; 
    } else { 
     if (currentState != 1) { 
      return currentState; 
     } else { 
      currentState++; 
      return 1; 
     } 
    } 
} 
protected void setIdle(boolean t) { 
    idle = t; 
} 

Picture of what it looks like in both runs after pressing the start button and trying to connect to the socket, debug mode to the right.

Antwort

1

Während Ihre Frage Überprüfung bearbeitet ich es die Lesbarkeit zu verbessern. Ich musste Ihren Code neu formatieren, da die Mischung aus Tabulatoren und Leerzeichen und inkonsistenter Einrückung den StackOverflow-Code-Parser vermasselte.

Während tun, dass ich denken ich die Antwort gefunden: das Schließen der geschweiften Klammer von public MainServer() { und das Schließen der ersten Runde Klammer von start.addActionListener(new ActionListener() falsch mit jedem-kreuzen.

Dies ist, was Sie haben:

public MainServer() { 
     ... 
     start.addActionListener(new ActionListener() { 
      ...     
     } 
    }); 

Das ist, was ich denke sollten Sie haben:

public MainServer() { 
     ... 
     start.addActionListener(new ActionListener() { 
      ...     
     }); 
    } 

ich Unterricht erraten gelernt werden:

  • Code-Formatierung ist wichtig - Sie hätten den Fehler auch gefunden, während Sie versuchen, im Code-Format konsistent zu sein ting
  • keine gute Idee für Einbuchtung
  • Räume für Vertiefung besser sind Tabulatoren und Leerzeichen zu mischen - freundlicheren Stackoverflow auf den Stackoverflow-Editor :)
+0

Hallo danke für deine Antwort, dies ist mein erstes Mal mit Ich kopiere einfach meinen Code von Eclipse in den Editor und bombardiere dann jede Zeile mit Leerzeichen. vielleicht nicht der beste Weg. Aber danke für die Bearbeitung meiner Frage sieht viel besser aus. Zu Ihrer Antwort, wenn ich Sie richtig verstehe, meinen Sie das "});" sollte so sein ");" am start.addActionListenter? Oder habe ich dich falsch verstanden? :) Wenn ich versuche, bekomme ich viele Fehler. Hast du noch andere Ideen? :) Danke – ThePerzon

+0

Ich klärte die Antwort –

+0

Ich konnte sehen, was du jetzt meinst. In der Eclipse was du vorschlägst ist was ich habe. Ich fand, es gab einen zu vielen "}" zu dem Punkt, den du erwähnt hast. Ich habe das bearbeitet. Haben Sie andere Ideen, was könnte das Problem sein? – ThePerzon

Verwandte Themen