2016-04-24 18 views
-1

我的主服務器以下循環完美的作品時,我通過它在調試模式下步驟:爲什麼java服務器的JFrame在調試模式下工作,但不是在正常執行模式下工作?

  • 當啓動按鈕被按下服務器與用戶在文本框寫的插座和啓動按鈕啓動被禁用
  • 當服務器啓動的消息
  • 顯示在大的textarea表示該端口和地址上運行它
  • 當客戶端連接到它會顯示一條消息,表明已建立連接
  • 服務器沒有得到卡在任何其他循環,除了主要的,這是退出只有當用戶選擇退出

但是,當我在正常模式下運行程序,並按下所發生的一切開始按鈕是:

  • 啓動按鈕被禁用
  • 沒有消息出現
  • 客戶端無法連接到指定的插座

讚賞任何幫助。

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; 
      } 
     } 
    } 
} 

此類爲服務器創建的接口它只是一個簡單的用一個大的文本區域,一個小文本框和2個按鈕與聽衆。

如果我不得不猜測它的服務器循環和動作偵聽器在互相仇恨的按鈕上,但我不明白它爲什麼在調試模式下工作。

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); 
} 

這些是一些功能,用於增加主循環和它們與接口放置在相同類中的接口之間的通信。

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.

回答

1

在審查您的問題,我編輯它,以提高其可讀性。我不得不重新格式化您的代碼,因爲標籤和空格以及不一致的縮進混合了StackOverflow代碼解析器。

雖然這樣做,我覺得找到了答案:在大括號從 public MainServer() {關閉和第一輪托架從start.addActionListener(new ActionListener()收盤每-其他不正確交叉。

這是你擁有的一切:

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

這是我認爲你應該有:

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

我想吸取的教訓:

  • 代碼格式化非常重要 - 在嘗試使代碼格式保持一致時,您也會發現錯誤婷
  • 不是一個好主意混合製表和空格進行縮進
  • 空間,是縮進更好 - 在StackOverflow的編輯:)友好
+0

嗨感謝您的答案,這是我平生第一次使用計算器我只是把我的代碼從eclipse複製/粘貼到編輯器中,然後用空格轟炸每一行。也許不是最好的選擇。但是謝謝你編輯我的問題看起來好多了。對於你的回答,如果我正確理解你,你的意思是「});」應該是這樣的「)};」在start.addActionListenter?或者我錯誤地理解了你? :) 如果我嘗試我得到很多錯誤。你還有其他建議嗎? :)謝謝 – ThePerzon

+0

我澄清了答案 –

+0

我可以看到你的意思了。在eclipse中,你建議的是我擁有的。根據你提到的觀點,我發現有一對多的「}」。我編輯了出來。你有什麼其他的想法可能是什麼問題? – ThePerzon

相關問題