线程的while(true)循环只运行一次

时间:2016-08-02 07:17:37

标签: java multithreading while-loop server

我有一个实现Runnable的类,我在窗口打开时运行的另一个方法启动它自己的线程,但是我只在Runnable方法中使用了while循环运行一次,我知道这是因为它只显示输出一次。这是下面的代码。

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

1 个答案:

答案 0 :(得分:9)

循环体以break;结束,终止循环。只需删除它就可以了。