Курс языка программирования 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-запросы →
💪 Или перейдите сразу к упражнениям этого
раздела.