У меня есть клиент-серверная программа чата, где сервер будет создавать новый поток для каждого принятого соединения, где 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);
}
}
}
Я понимаю, что если это был анонимный поток, я мог бы вызвать метод широковещания изнутри сервера. Как я могу вызвать этот метод в классе потока?
Спасибо заранее за ваш отзыв.