簡體   English   中英

線程的while(true)循環僅運行一次

[英]Thread's while (true) loop only running once

我有一個實現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();
}  

循環的主體以break;結束break; 終止循環。 只需將其刪除,就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM