← Назад к вопросам

Как будешь ждать вызов на сервере

1.7 Middle🔥 131 комментариев
#Основы Java

Комментарии (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();
}

Как это работает

  1. Приложение запускается и начинает слушать порт (8080, 443 и т.д.)
  2. Event loop постоянно проверяет наличие входящих соединений
  3. Когда клиент подключается, контейнер создает новый поток (из пула)
  4. Новый поток обрабатывает запрос и отправляет ответ
  5. Основной поток продолжает слушать новые соединения
  6. Процесс повторяется для каждого нового запроса

Сервер никогда не останавливается (пока не будет остановлен явно) и всегда ждет новых запросов.

Как будешь ждать вызов на сервере | PrepBro