Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Веб-програмування / Віддалені з’єднання

Надсилання та отримання

Щойно сокет відкрито, ви обмінюєтеся через нього даними. Надсилайте текст через .print, а читайте те, що приходить назад, через .recv:

my $conn = IO::Socket::INET.new(:host('raku.org'), :port(80));

$conn.print("GET / HTTP/1.0\r\nHost: raku.org\r\n\r\n");
my $response = $conn.recv;

$conn.close;
say $response.lines.first;

Це надсилає мінімальний HTTP-запит і читає відповідь сервера в $response. Першим рядком відповіді вебсервера є його рядок стану.

Цьому прикладові потрібне робоче мережеве з’єднання. Коли його запустити, він друкує рядок стану відповіді. Оскільки raku.org перенаправляє звичайний HTTP на захищений HTTPS-сайт, цим рядком є перенаправлення, як-от HTTP/1.1 308 Permanent Redirect, а не 200 OK. Особливий домен example.com не перенаправляє, тож той самий запит, спрямований туди, надрукує звичайне HTTP/1.1 200 OK.

Спілкуючись із серверами, важливо пам’ятати дві деталі. По-перше, мережеві протоколи зазвичай розділяють рядки через \r\n (повернення каретки плюс новий рядок), а не простим \n, — саме тому запит записано з \r\n. По-друге, .recv повертає ті дані, що надійшли на цю мить; для більших відповідей ви читаєте в циклі, аж поки з’єднання не закриється.

Надсилання байтів і отримання байтів — це все, що сокет насправді робить. Усе інше — HTTP та вищерівневі засоби з наступних розділів — збудовано поверх цього простого «надішли й отримай».

Практика

Виконайте 1 тест за змістом цієї теми.

Навігація курсом

Тест — Сокети   |   Тест — HTTP-запити


💪 Або перейдіть одразу до вправ цього розділу.