Comments 7
может джаве кол осиновый надо вбить? не берет ее земля
Кроме этого можно рассмотреть вариант с AsynchronousServerSocketChannel и AsynchronousSocketChannel. Их можно удобно использовать из Kotlin корутин. С селекторами всё немного запутанно. По производительности, вероятно, и то и то - примерно одинаково.
Просто удивительно, как часто люди забывают приложить к заметке «создаём свой веб-сервер» банальный бенчмарк на wrk, или любом аналоге.
Теперь тестируем через браузер или
curl
: […]Сервер ① работает, ② не блокирует потоки, ③ может обслуживать тысячи соединений и ④ полностью основан на Java NIO.
Из перечисленного выше не нуждается в аргументации только ④. ① «Работает» — это не значит «смог обслужить один запрос». ② Ну так отправьте ему 10К запросов и покажите бенчмарк. ③ А может, и нет, см. ②.
Вот, для примера, бенчмарк моей config-first библиотечки на эликсире.
Как-то маловато. Этот прототип нельзя назвать HTTP-сервером, потому что тут нет парсинга HTTP, оно на любой однобайтный коннект сработает. А парсинг HTTP - это же самое интересное, потому что напрямую влияет на работу с NIO. Например, в handleRequest() зачем-то каждый раз аллоцируется ByteBuffer, хотя содержимое HTTP-запроса может приходить несколькими кусками. Правильный способ - привязывать ByteBuffer к socketChannel-у, и умело работать с ByteBuffer-ом через compact()/flip(). А по этой статье вообще не ясно, зачем flip() вызвали.
Ну и так, пара косяков. Первое: вы закрываете socketChannel, но оставляете его SelectionKey в Selector-е, это неправильно, нужно на ключе делать cancel(). Второе: вы делаете write() на неблокирующем канале, и даже не проверяете записалось оно или нет.
Ну я бы назвал не так громко.
Например, "Простейший tcp сервер на nio".
На "Пишем http сервер' не тянет.
handleRequest(key) там ещё может не быть запроса, потому что он может приходить по частям tcp не пакетный протокол
На HTTP сервер, как уже отметили выше, не тянет, только на TCP.
Хорошо было бы рассмотреть, как использовать уже имеющийся в JDK com.sun.net.httpserver.HttpServer
в неблокируещем режиме, и, например, с использованием Virtual threads. Хотя, похоже, всё это сведётся к банальной строчке server.setExecutor(Executors.newVirtualThreadPerTaskExecutor())
.
Создаём HTTP-сервер на Java NIO