Курс языка программирования 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-запросы


💪 Или перейдите сразу к упражнениям этого раздела.