Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Как будешь ждать вызов на сервере
Вопрос о том, как приложение на сервере остается в состоянии ожидания входящих запросов.
Основной механизм: Event Loop
Сервер постоянно слушает входящие соединения на определенном порту:
public class SimpleServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Сервер слушает порт 8080");
while (true) {
Socket clientSocket = serverSocket.accept(); // Ждем клиента
System.out.println("Клиент подключился");
}
}
}
В контексте Spring Boot
Spring Boot создает встроенный Tomcat сервер который слушает на определенном порту:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello";
}
}
Многопоточность для одновременной обработки
public class MultiThreadedServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
ExecutorService threadPool = Executors.newFixedThreadPool(10);
while (true) {
Socket clientSocket = serverSocket.accept();
threadPool.execute(() -> handleClient(clientSocket));
}
}
}
Thread Pool из Servlet контейнера
Tomcat, JBoss и другие контейнеры имеют встроенный пул потоков для обработки запросов.
NIO - асинхронный подход
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.configureBlocking(false);
Selector selector = Selector.open();
serverSocket.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select(); // Ждем события
}
Асинхронная обработка в Spring
@GetMapping("/async")
public CompletableFuture<String> asyncRequest() {
return CompletableFuture.supplyAsync(() -> {
return "Результат";
});
}
Reactive подход
@GetMapping("/users")
public Flux<User> getUsers() {
return userService.getAllUsersReactive();
}
Как это работает
- Приложение запускается и начинает слушать порт (8080, 443 и т.д.)
- Event loop постоянно проверяет наличие входящих соединений
- Когда клиент подключается, контейнер создает новый поток (из пула)
- Новый поток обрабатывает запрос и отправляет ответ
- Основной поток продолжает слушать новые соединения
- Процесс повторяется для каждого нового запроса
Сервер никогда не останавливается (пока не будет остановлен явно) и всегда ждет новых запросов.