Как объект потока Java может вызвать метод из исходного класса? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть клиент-серверная программа чата, где сервер будет создавать новый поток для каждого принятого соединения, где NewClient расширяет поток для обработки запросов от указанного c клиента.

Вот фрагмент кода сервера:

public void startServer() {
    // thread to handle requests
    new Thread(() -> {
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("Server started at " + new Date());

            while (true) {
                // listen for connection request
                Socket socket = serverSocket.accept();

                // increment total clients connected
                clientCount++;

                // create new client
                NewClient newClient = new NewClient(socket, clientCount);

                // add client to active client list
                activeClientList.add(newClient);

                // start thread
                newClient.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }).start();
}

В NewClient поток будет l oop и проверит поток ввода. Если входной поток обнаружен, я хочу, чтобы он передавал сообщение во входном потоке всем клиентам.

Вот метод запуска NewClient:

public void run() {
    while(true) {
        try {
            // read from client
            Data message = (Data) objectInputStream.readObject();
            System.out.println("Received " + message.text + " from " + message.name);

            // broadcast to all clients
            // broadcastMessage(message)


        } catch (IOException | ClassNotFoundException e) {
            System.out.println("Failed to get input stream");
            e.printStackTrace();
        }
    }
}

Назад в класс сервера есть метод broadcastMessage (Data data), который будет l oop через все подключенные клиенты в списке массивов и использовать выходные потоки для отправки данных каждому клиенту.

Вот метод :

public synchronized void broadcastMessage(Data data) {
    Integer size = activeClientList.size();

    // loop through all clients
    for(int i=size-1;i>=0;i--) {
        NewClient client = activeClientList.get(i);

        if(!client.writeToClient(data)) {
            activeClientList.remove(i);

            // notify users of disconnect
            Data update = new Data(data.name, data.name + " has disconnected.");
            broadcastMessage(update);
        }
    }
}

Я понимаю, что если это был анонимный поток, я мог бы вызвать метод широковещания изнутри сервера. Как я могу вызвать этот метод в классе потока?

Спасибо заранее за ваш отзыв.

1 Ответ

1 голос
/ 12 апреля 2020
// create new client
NewClient newClient = new NewClient(socket, clientCount, this);

Спасибо, Йоханнес Кун, за указание на то, что сервер может быть передан в конструктор потоков для вызова метода.

...