2016-08-02 6 views
-1

У меня есть класс, который реализует Runnable, и я запускаю его собственный поток в другом методе, который запускается при открытии окна, однако цикл while, который у меня есть в методе Runnable, выполняется только один раз, Я знаю это, потому что он выводит вывод только один раз. Это код ниже.цикл while (true) работает только один раз

static private final int SOCKET = 2222; 
static JFrame frame = new JFrame(); 
static private ServerSocket serverSocket; 
static private Socket socket; 
static private DataOutputStream out; 
static private DataInputStream in; 
static private ArrayList<User> users = new ArrayList<>(); 
static private int logged = -1; 

public GameServer() { 
    initComponents(); 
} 

public void runServer() { 
    Thread server = new Thread(new StartServer()); 
    server.start(); 
} 

public void addUser(int logged, Socket socket, JTextArea taOut) { 
    users.add(logged, new User(socket, taOut, this, logged)); 
    Thread thread = new Thread(users.get(logged)); 
    thread.start(); 
} 

public void removeUser(int index, Socket socket) { 
    users.remove(index); 
    updateIndexes(); 
    try { 
     socket.close(); 
    } catch (Exception e) { 
     taOut.append("Failed to close connection to user.\n"); 
    } 
} 

public void updateIndexes() { 
    for (int i = 0; i == users.size()+1; i++) users.get(i).lowerIndex(); 
    logged--; 
} 

public class StartServer implements Runnable { 
    @Override 
    public void run() { 
     taOut.append("Attempting to start server.\n"); 
     try { 
      serverSocket = new ServerSocket(SOCKET); 
     } catch (Exception e) { 
      taOut.append("Port "+SOCKET+" is in use.\n"); 
      return; // Prevent any further code from executing 
     } 
     taOut.append("Server started successfully.\n"); 
     while (true) { 
      try { 
       taOut.append("Waiting for user...\n"); 
       socket = serverSocket.accept(); // Wait for user to connect 
       logged++; 
       addUser(logged, socket, taOut); 
       taOut.append("Login request from: "+socket.getInetAddress()+"\n"); 
      } catch (Exception e) { 
       taOut.append("There was an error with a user trying to connect.\n"); 
      } 
      break; 
     } 
    } 
} 

private void formWindowOpened(java.awt.event.WindowEvent evt) {         
    runServer(); 
} 
+4

неудивительно, что ** перерыв ** после блока try-catch – kofemann

ответ

9

Тело цикла заканчивается break;, что завершает цикл. Просто удалите его, и все будет в порядке.

+1

Спасибо за информацию, думаю, я должен был больше смотреть в циклы, а не на поток. – Jono

+1

@Jono Если вы идете в потоки, когда вы не понимаете циклы, это эквивалент климатизации дерева **. – Kayaman

+1

@ Kayaman Я сделал перерыв в работе с любой Java, мне просто нужно освежиться. – Jono

Смежные вопросы