Управлять как минимум тремя потоками в JavaFx - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь настроить свой сервер для управления как минимум 3-мя клиентами, но когда я это делаю, я получаю ошибку «Недостаточно памяти» еще до подключения первого.Как я могу улучшить это?В ThreadedEchoHandler() есть часть, где я принимаю запрос клиента и метод run, который содержит все, что должен делать сервер.

public void initModel() throws IOException {
    contenutoTextArea.append("Waiting for connections\n");
    textarea.setText(contenutoTextArea.toString());
    s = new ServerSocket(5000);
    while (true) {
        Runnable r = new ThreadedEchoHandler();
        new Thread(r).start();
    }
}

EDIT: запуск ThreadedEchoHandler:

lass ThreadedEchoHandler implements Runnable {

    private Socket incoming;

    private String nomeAccount = "";

    public void run() {
        try {
            incoming = s.accept();
        } catch (IOException ex) {
            System.out.println("Unable to accept requests");
        }
    }

1 Ответ

0 голосов
/ 09 декабря 2018

Вы должны выполнить accept в том же потоке, где происходит цикл while, а затем, после получения нового принятого соединения, запустить новый поток:

while (true) {
    Socket incoming = s.accept();
    Runnable r = new ThreadedEchoHandler(incoming);
    new Thread(r).start();
}

И изменить ThreadEchoHandler чтобы получить Socket извне:

class ThreadedEchoHandler implements Runnable {
    final private Socket incoming;
    private String nomeAccount = "";

    ThreadedEchoHandler(Socket incoming) {
        this.incoming = incoming;
    }

    public void run() {
        // do stuff
    }
}

Конечно, вы можете организовать его различными способами, например, ThreadedEchoHandler может запустить поток из конструктора или даже сделать accept тоже,но опять же, это должно произойти до запуска потока:

class ThreadedEchoHandler implements Runnable {
    final private Socket incoming;
    private String nomeAccount = "";

    ThreadedEchoHandler(ServerSocket serv) throws IOException {
        incoming = serv.accept();
        new Thread(this).start();
    }

    public void run() {
        // do stuff
    }
}

тогда цикл может быть таким:

while (true) new ThreadedEchoHandler(s);
...