rebol document

Глава 13 - Сетевые протоколы

Руководство пользователя REBOL/Core
Основное содержание
Отправьте нам отзыв

Содержание:

1. Обзор
2. Основы работы с сетью в REBOL
2.1 Режимы работы
2.2 Указание сетевых ресурсов
2.3 Схемы, обработчики и протоколы
2.4 Обработчики мониторинга
3. Первоначальная настройка
3.1 Основные параметры сети
3.2 Параметры прокси
3.3 Другие параметры
3.4 Доступ к настройкам
4. DNS - Domain Name Service
5. Протокол Whois
6. Протокол Finger
7. Daytime - Протокол сетевого времени
8. HTTP - Протокол передачи гипертекста
8.1 Чтение веб-страницы
8.2 Сценарии на веб-сайтах
8.3 Загрузка страниц разметки
8.4 Другие функции
8.5 Работа как браузер
8.6 Отправка запросов CGI
9. SMTP - простой протокол передачи почты
9.1 Отправка электронной почты
9.2 Несколько получателей
9.3 Массовая рассылка
9.4 Тема и заголовки
9.5 Отладка ваших сценариев
10. POP - протокол почтового отделения
10.1 Чтение электронной почты
10.2 Удаление электронной почты
10.3 Обработка заголовков электронной почты
11. FTP - протокол передачи файлов
11.1 Использование FTP
11.2 URL-адреса FTP
11.3 Передача текстовых файлов
11.4 Передача двоичных файлов
11.5 Добавление к файлам
11.6 Чтение каталогов
11.7 Информация о файлах
11.8 Создание каталогов
11.9 Удаление файлов
11.10 Удаление файлов
11.11 О паролях
11.12 Передача больших файлов
12. NNTP - сетевой протокол передачи новостей
12.1 Чтение списка групп новостей
12.2 Чтение всех сообщений
12.3 Чтение отдельных сообщений
12.4 Обработка заголовков новостей
12.5 Отправка новостного сообщения
13. CGI - общий интерфейс шлюза
13.1 Настройка сервера CGI
13.2 Сценарии CGI
13.3 Создание содержимого HTML
13.4 CGI среда
13.5 Запросы CGI
13.6 Обработка HTML-форм
14. TCP - протокол управления передачей
14.1 Создание клиентов
14.2 Создание серверов
14.3 Крошечный сервер
14.4 Тестирование кода TCP
15. UDP - протокол дейтаграмм пользователя

1. Обзор

REBOL включает несколько встроенных основных протоколов интернет-сервисов. Эти протоколы легко использовать в ваших сценариях; они не требуют дополнительных библиотек или включаемых файлов, и многие полезные операции могут быть выполнены с помощью только одной строчки исходного кода.

Поддерживаются протоколы, перечисленные в Сетевые протоколы:

 DNSDomain Name Service: Служба доменных имен: переводит имена компьютеров в адреса и адреса в имена.
 FingerПолучает информацию о пользователе из его профиля.
 WhoisПолучает информацию о регистрации домена.
 DaytimeСетевой протокол времени. Получает время с сервера.
 HTTPHypertext Transfer Protocol. Протокол передачи гипертекста. Используется для Интернета.
 SMTPSimple Mail Transfer Protocol. Простой протокол передачи почты. Используется для отправки электронной почты.
 POPPost Office Protocol. Почтовый протокол. Используется для получения электронной почты.
 FTPFile Transfer Protocol. Протокол передачи файлов. Обменивается файлами с сервером.
 NNTPNetwork News Transfer Protocol. Протокол передачи сетевых новостей. Публикует или читает новости Usenet.
 TCPTransmission Control Protocol. Протокол управления передачей. Базовый интернет-протокол.
 UDPUser Datagram Protocol. Протокол пользовательских датаграмм. Пакетный протокол.

Кроме того, вы можете создавать обработчики для других Интернет-протоколов или создавать свои собственные протоколы.

2. Основы работы с сетью REBOL

2.1 Режимы работы

Существует два основных режима работы сети: атомарный и портовый.

Атомарные сетевые операции - это операции, которые выполняются с помощью одной функции. Например, вы можете прочитать всю веб-страницу с помощью одного вызова функции чтения. Нет необходимости отдельно открывать соединение или настраивать чтение. Все это делается автоматически как часть чтения. Например, вы можете ввести:

print read http://www.rebol.com

Хост найден и открыт, его веб-страница перенесена, а соединение закрыто.

На основе портов режим работы один, который использует более традиционный программный подход. Он включает в себя открытие порта и выполнение с ним различных последовательных операций. Например, если вы хотите читать свою электронную почту с POP-сервера по одному сообщению за раз, вы должны использовать этот метод. Вот пример, который читает и отображает всю вашу электронную почту:

pop: open pop://user:pass@mail.example.com
forall pop [print first pop]
close pop

Атомарный метод работы проще, но он более ограничен. Метод на основе портов позволяет выполнять больше типов операций, но также требует более глубокого понимания работы в сети.

2.2 Указание сетевых ресурсов

REBOL предлагает два подхода к определению сетевых ресурсов: URL-адреса и спецификации портов.

Унифицированные указатели ресурсов (URL) используются в Интернете для идентификации сетевого ресурса, такого как веб-страница, FTP-сайт, адрес электронной почты, файл или другой ресурс или услуга. URL-адреса являются неотъемлемой частью работы REBOL, и они могут быть выражены непосредственно на языке.

Стандартное обозначение URL-адресов состоит из схемы (scheme), за которой следует спецификация:

scheme:specification

Схема часто представляет собой имя протокола, например HTTP, FTP, SMTP и POP; однако это не является обязательным требованием. Схема может быть любым именем, которое идентифицирует метод, используемый для доступа к ресурсу.

Формат спецификации схемы зависит от схемы; однако в большинстве схем используется общий формат для определения сетевых хостов, имен пользователей, паролей, номеров портов и путей к файлам. Вот несколько часто используемых форматов:

scheme://host

scheme://host:port

scheme://user@host

scheme://user:pass@host

scheme://user:pass@host:port

scheme://host/path

scheme://host:port/path

scheme://user@host/path

scheme://user:pass@host/path

scheme://user:pass@host:port/path

В Спецификации сетевых ресурсов перечислены поля, используемые в вышеуказанных форматах.

 schemeИмя, используемое для идентификации типа ресурса, часто такое же, как протокол. Например, HTTP, FTP и POP.
 hostСетевое имя или адрес машины. Например, www.rebol.com, cnn.com, 192.168.0.1.
 portНомер порта на хост-машине для используемой схемы. Обычно для этого есть значение по умолчанию, поэтому в большинстве случаев это не требуется. Примеры: 21, 23, 80, 8000.
 userИмя пользователя для доступа к ресурсу.
 passПароль для проверки имени пользователя.
 pathПуть к файлу или другой способ обращения к ресурсу. Это зависит от схемы (scheme). Некоторые схемы включают шаблоны и аргументы сценария (например, CGI).

Другой способ идентифицировать ресурс - использовать спецификацию port (порт) REBOL . Фактически, когда используется URL-адрес, он автоматически преобразуется в спецификацию порта. Спецификация порта может принимать намного больше аргументов, чем URL-адрес, но для ее выражения требуется несколько строк.

Спецификация порта записывается как определение объектного блока, которое предоставляет все параметры, необходимые для доступа к сетевому ресурсу. Например, URL-адрес для доступа к веб-сайту:

read http://www.rebol.com/developer.html

но это также можно записать как:

read [
    scheme: 'HTTP
    host: "www.rebol.com"
    target: %/developer.html
]

URL-адрес для чтения FTP может быть:

read ftp://bill:vbs@ftp.example.com:8000/file.txt

но это также можно записать как:

read [
    scheme: 'FTP
    host: "ftp.example.com"
    port-id: 8000
    target: %/file.txt
    user: "bill"
    pass: "vbs"
]

Кроме того, есть много других полей порта, которые можно указать, например тайм-аут, тип доступа и безопасность.

2.3 Схемы, обработчики и протоколы

Сеть REBOL работает с использованием схем (schemes) для идентификации обработчиков (handlers), которые обмениваются данными с протоколами (protocols).

В REBOL схема (schemes) используется для идентификации метода доступа к ресурсу. Этот метод использует объект кода, который называется обработчиком (handlers). Каждая из схем URL-адресов, поддерживаемых REBOL (например, HTTP, FTP), имеет обработчик. Список схем можно получить с помощью:

probe next first system/schemes
[default Finger Whois Daytime SMTP POP HTTP FTP NNTP]

Кроме того, есть имена схем более низкого уровня, которые здесь не показаны. Например, схемы TCP и UDP используются для прямой связи более низкого уровня.

В этот список можно добавлять новые схемы. Например, вы можете определить свою собственную схему, называемую FTP2, которая предоставляет специальные функции для доступа по FTP, такие как автоматическое указание вашего имени пользователя и пароля, поэтому его не нужно включать в каждый URL-адрес FTP.

Большинство обработчиков используются для обеспечения интерфейса для сетевого протокола. Протокол (protocol) используется для обмена данными между различными устройствами, в том числе клиентов и серверов.

Несмотря на то, что каждый протокол очень отличается по способу взаимодействия, у него есть некоторые общие черты с другими протоколами. Например, для большинства протоколов требуется, чтобы сетевое соединение было открыто (opened), прочитано (read), записано (written) и закрыто (closed). Эти общие операции выполняются обработчиком по умолчанию в REBOL. Этот обработчик упрощает реализацию таких протоколов, как finger, whois и daytime.

Обработчики схем записываются как объекты. Обработчик по умолчанию служит корневым объектом для всех остальных обработчиков. Когда обработчику требуется определенное поле, например значение тайм-аута для чтения данных, если значение не определено в конкретном обработчике, оно будет предоставлено обработчиком по умолчанию. Следовательно, обработчики накладывают друг на друга свои поля и значения. Вы также можете создать обработчики, которые используют другие обработчики для значений по умолчанию. Например, вы можете создать обработчик FTP2, который сначала ищет отсутствующие поля в обработчике FTP, а затем в обработчике по умолчанию.

Когда порт используется для доступа к сетевым ресурсам, он связан с определенным обработчиком. Обработчик и порт вместе образуют единицу, которая используется для предоставления данных, кода и информации о состоянии для обработки всех протоколов.

Исходный код обработчиков можно получить из объекта system/scheme (система/схема). Это может быть полезно, если вы хотите изменить поведение обработчика или создать свой собственный обработчик. Например, чтобы просмотреть код обработчика whois, введите:

probe get in system/schemes 'whois

Обратите внимание, что вы видите составную часть обработчика по умолчанию и обработчика whois. Фактический исходный код, который используется для создания обработчика whois, состоит всего из нескольких строк:

make Root-Protocol [
    open-check:  [[any [port/user ""]] none]
    net-utils/net-install Whois make self [] 43
]

2.4 Обработчики мониторинга

В целях отладки вы можете отслеживать действия любого обработчика. У каждого обработчика есть свои собственные выходные данные отладки, чтобы указать, какие операции выполняются. Чтобы включить отладку сети, включите трассировку сети с помощью строки:

trace/net on

Чтобы отключить отладку сети, используйте:

trace/net off

Вот пример:

read pop://carl:poof@zen.example.com
URL Parse: carl poof zen.example.com none none none
Net-log: ["Opening tcp for" POP]
connecting to: zen.example.com
Net-log: [none "+OK"]
Net-log: {+OK QPOP (version 2.53) at zen.example.com starting.}
Net-log: [["USER" port/user] "+OK"]
Net-log: "+OK Password required for carl."
Net-log: [["PASS" port/pass] "+OK"]
** User Error: Server error: tcp -ERR Password supplied for "carl"
is incorrect.
** Where: read pop://carl:poof@zen.example.com

3. Начальная настройка

Сеть REBOL встроена. Для создания сценариев, использующих сетевые протоколы, вам не нужны специальные включаемые файлы или библиотеки. Единственное требование - предоставить основную информацию, необходимую для подключения протоколов к серверам или через брандмауэры и прокси. Например, для отправки электронной почты протоколу SMTP необходимо имя SMTP-сервера и адрес электронной почты для ответа.

3.1 Основные настройки сети

Когда вы запускаете REBOL в первый раз, вам будет предложено ввести необходимые сетевые настройки, которые хранятся в файле user.r. REBOL использует этот файл для загрузки необходимых сетевых настроек при каждом запуске. Если user.r не создан и REBOL не может найти существующий файл в своих путях, никакие настройки не загружаются. См. Главу «Эксплуатация» для получения дополнительной информации.

Чтобы изменить настройки сети, введите в командной строке set-user. Это запускает тот же сценарий конфигурации сети, который запускался при первом запуске REBOL. Этот скрипт загружается из файла user.r. Если этот файл не может быть найден или если вы хотите отредактировать настройку напрямую, вы можете использовать текстовый редактор для user.r.

В файле user.r настройки сети находятся в блоке, который следует за функцией set-net. Как минимум, блок должен содержать два элемента:

  • Ваш адрес электронной почты для использования в полях отправителя и ответа в сообщениях электронной почты, а также для анонимного входа по FTP.
  • Ваш сервер по умолчанию; это также ваш основной почтовый сервер.

Кроме того, вы можете указать еще несколько пунктов:

  • Другой сервер входящей электронной почты (для POP)
  • Прокси-сервер (для подключения к сети)
  • Номер порта прокси
  • Тип прокси (см. Настройки прокси ниже).

Вы также можете добавить строки после функции set-net для настройки других значений протокола. Например, вы можете установить значения тайм-аута для протоколов, установить пассивный режим FTP, установить идентификатор HTTP-агента пользователя, настроить отдельные прокси для разных протоколов и многое другое.

Пример set-net:

set-net [user@domain.dom mail.server.dom]

В первом поле указана ваша электронная почта с адреса, а во втором поле указан ваш сервер по умолчанию (обратите внимание, что здесь кавычки не требуются). Для большинства сетей этого достаточно, и никаких других настроек не требуется (если вам не нужен прокси). Также ваш сервер по умолчанию используется всякий раз, когда конкретный сервер не предоставляется.

Кроме того, если вы используете POP-сервер (для входящей электронной почты), отличный от вашего SMTP-сервера (для исходящей электронной почты), вы также можете указать это:

set-net [
    user@domain.dom
    mail.server.dom
    pop.server.dom
]

Однако, если у вас одинаковые SMTP и POP-серверы, в этом нет необходимости.

3.2 Настройки прокси

Если вы используете прокси или брандмауэр, вы можете предоставить функцию set-net с настройками вашего прокси. Это может включать имя или адрес прокси-сервера, номер порта прокси для доступа к серверу и необязательный тип прокси. Например:

set-net [
    email@addr
    mail.example.com
    pop.example.com
    proxy.example.com
    1080
    socks
]

В этом примере будет использоваться прокси-сервер с именем proxy.example.com на его TCP-порту 1080 с методом прокси-сервера socks. Чтобы использовать прокси-сервер socks4, используйте слово socks4, а не socks. Чтобы использовать общий сервер CERN, используйте слово generic.

Вы также можете настроить прокси на разные машины для разных схем (протоколов). Каждый протокол имеет свой собственный прокси-объект, где вы можете установить значения прокси только для этой схемы. Вот пример настройки прокси для FTP:

system/schemes/ftp/proxy/host: "proxy2.example.com"

system/schemes/ftp/proxy/port-id: 1080

system/schemes/ftp/proxy/type: 'socks

В этом случае только FTP использует специальный прокси-сервер. Обратите внимание, что имя компьютера должно быть строкой, а тип прокси - буквальным словом.

Вот еще два примера. В первом примере прокси-сервер для HTTP устанавливается как общий (CERN) метод прокси-сервера:

system/schemes/http/proxy/host: "wp.example.com"

system/schemes/http/proxy/port-id: 8080

system/schemes/http/proxy/type: 'generic

В приведенном выше примере все HTTP-запросы проходят через общий прокси-сервер на wp.example.com с использованием TCP-порта 8080.

Если вы хотите отключить настройки прокси для определенной схемы, вы можете установить для полей прокси значение false.

system/schemes/smtp/proxy/host: false

system/schemes/smtp/proxy/port-id: false

system/schemes/smtp/proxy/type: false

В приведенном выше примере вся исходящая электронная почта не проходит через прокси. Значение false предотвращает использование даже прокси по умолчанию. Если вы установите для этих полей значение none, то будет использоваться прокси по умолчанию, если он настроен.

Если вы хотите обойти настройки прокси-сервера для определенных машин, например, в вашей локальной сети, вы можете предоставить список обхода. Вот список обхода прокси по умолчанию:

system/schemes/default/proxy/bypass:
    ["host.example.net" "*.example.com"]

Обратите внимание, что для сопоставления с образцом можно использовать символы звездочки (*) и вопросительного знака (?). Звездочка (*), используемая в приведенном выше примере, позволяет обойти все машины, заканчивающиеся на example.com.

Чтобы установить список обхода только для схемы HTTP, введите:

system/schemes/http/proxy/bypass:
    ["host.example.net" "*.example.com"]

3.3 Другие настройки

Помимо настроек прокси, вы можете установить значения тайм-аута сети для всех схем (по умолчанию) или для определенных схем. Например, чтобы увеличить время ожидания для всех схем, вы можете написать:

system/schemes/default/timeout: 0:05

Это устанавливает тайм-аут сети на 5 минут.

Если вы хотите увеличить тайм-аут только для SMTP, вы должны написать:

system/schemes/smtp/timeout: 0:10

В некоторых схемах (schemes) есть настраиваемые поля. Например, схема FTP позволяет установить пассивный режим для всех передач:

system/schemes/ftp/passive: on

Пассивный режим FTP полезен, потому что FTP-серверы, которые установлены в пассивный режим, не пытаются подключиться обратно через ваш брандмауэр.

При выполнении HTTP-доступа к веб-сайтам вы можете захотеть использовать другое поле user-agent в HTTP-запросе, чтобы получить лучшие результаты на нескольких сайтах, которые определяют тип браузера:

system/schemes/http/user-agent: "Mozilla/4.0"

3.4 Доступ к настройкам

Каждый раз, когда REBOL запускается, он читает файл user.r, чтобы найти сетевые настройки. Эти настройки выполняются с помощью функции set-net. Скрипты имеют доступ к этим настройкам через объект system/schemes.

system/user/email ; used for email from and reply
system/schemes/default/host - your primary server
system/schemes/pop/host - your POP server
system/schemes/default/proxy/host - proxy server
system/schemes/default/proxy/port-id - proxy port
system/schemes/default/proxy/type - proxy type

Ниже приведена функция, которая возвращает блок, содержащий настройки сети, в том же порядке, в котором их принимает set-net:\\

get-net: func [][
    reduce [
        system/user/email
        system/schemes/default/host
        system/schemes/pop/host
        system/schemes/default/proxy/host
        system/schemes/default/proxy/port-id
        system/schemes/default/proxy/type
    ]
]

probe get-net

4. DNS - служба доменных имен (Domain Name Service)

DNS - это сетевая служба, которая переводит доменные имена в связанные с ними IP-адреса. Кроме того, вы можете использовать DNS для поиска машины и доменного имени по IP-адресу.

Протокол DNS можно использовать тремя способами: вы можете найти первичный IP-адрес в имени машины, вы можете найти в доменном имени IP-адрес и вы можете найти имя и IP-адрес вашей локальной системы.

Чтобы найти основной IP-адрес определенного компьютера в определенном домене, введите:

print read dns://www.rebol.com
207.69.132.8

Вы также можете получить доменное имя, связанное с определенным IP-адресом:

print read dns://207.69.132.8
rebol.com

Обратите внимание, что этот обратный поиск DNS нередко возвращает значение «none». Есть машины, у которых нет имен хостов.

print read dns://11.22.33.44
none

Чтобы узнать имя хоста вашей системы, прочтите пустой URL-адрес DNS в форме:

print read dns://
crackerjack

Возвращаемые здесь данные зависят от типа машины. Это может быть неполное имя хоста, как показано выше, но также может быть полное имя хоста, crackerjack.example.com. Это зависит от операционной системы и конфигурации сети в операционной системе.

Вот пример, который ищет и распечатывает IP-адреса для ряда веб-сайтов:

domains: [
    www.rebol.com
    www.rebol.org
    www.mochinet.com
    www.sirius.com
]

foreach domain domains [
    print ["address for" domain "is:"
        read join dns:// domain]
]
address for www.rebol.com is: 207.69.132.8
address for www.rebol.org is: 207.66.107.61
address for www.mochinet.com is: 216.127.92.70
address for www.sirius.com is: 205.134.224.1

5. Протокол Whois

Протокол whois получает информацию о доменных именах из центрального реестра. Сервис whois предоставляется организациями, работающими в Интернете. Whois часто используется для получения регистрационной информации о домене или сервере в Интернете. Он может сказать вам, кто владеет доменом, как можно связаться с их техническим контактом, а также другую информацию.

Для получения информации используйте функцию read (чтение) с URL-адресом whois. Этот URL-адрес должен содержать имя домена и имя сервера Whois, разделенные знаком (@). Например, чтобы получить информацию о example.com из реестра Internic:

print read whois://example.com@rs.internic.net
connecting to: rs.internic.net
Whois Server Version 1.1
Domain names in the .com, .net, and .org domains can now be
registered with many different competing registrars. Go to
http://www.internic.net for detailed information.
Domain Name: EXAMPLE.COM
Registrar: NETWORK SOLUTIONS, INC.
Whois Server: whois.networksolutions.com
Referral URL: www.networksolutions.com
Name Server: NS.ISI.EDU
Name Server: VENERA.ISI.EDU
Updated Date: 17-aug-1999
>>> Last update of whois database: Sun, 16 Jul 00 03:16:34 EDT <<<
The Registry database contains ONLY .COM, .NET, .ORG, .EDU domains
and Registrars.

Приведенный выше код является только примером. Детали возвращаемой информации и серверов, поддерживающих whois, со временем меняются.

Если вместо имени домена вы укажете слово, будут возвращены все записи, соответствующие этому слову:

print read whois://example@rs.internic.net
connecting to: rs.internic.net
Whois Server Version 1.1
Domain names in the .com, .net, and .org domains can now be
registered with many different competing registrars. Go to
http://www.internic.net for detailed information.
EXAMPLE.512BIT.ORG
EXAMPLE.ORG
EXAMPLE.NET
EXAMPLE.EDU
EXAMPLE.COM
To single out one record, look it up with "xxx", where xxx is one
of the of the records displayed above. If the records are the same, look them
up with "=xxx" to receive a full display for each record.
>>> Last update of whois database: Sun, 16 Jul 00 03:16:34 EDT <<<
The Registry database contains ONLY .COM, .NET, .ORG, .EDU domains
and Registrars.

Протокол whois не принимает URL-адреса, такие как www.example.com, если только URL-адрес не является частью названия компании регистранта.

6. Протокол Finger

Протокол finger извлекает информацию о пользователе, хранящуюся в файле журнала пользователя.

Чтобы запросить информацию о пользователе с сервера, он должен работать по протоколу finger. Информация запрашивается путем чтения пальца (finger) URL-адреса, который содержит имя пользователя и имя домена в формате стиля электронной почты:

print read finger://username@example.com

В приведенном выше примере извлекается информация о пользователе по адресу username@example.com. Возвращаемая информация зависит от информации, предоставленной пользователем, и настроек сервера finger. Кроме того, детали возвращаемой информации зависят от каждого сервера; приведенные ниже примеры описывают только типичные серверы. Многие серверы могут вести себя нестандартно на своих цифровых портах.

Например, может быть возвращена следующая информация:

Login: username
Name: Firstname Lastname
Directory: /home/user
Shell: /usr/local/bin/tcsh
Office: City, State +1 555 555 5555
Last login Wed Jul 28 01:10 (PDT) on ttyp0 from some.example.com
No Mail.
No Plan.

Обратите внимание, что finger сообщает, когда пользователь в последний раз входил в систему с машины и есть ли у пользователя ожидающая почта. Если пользователь читает электронную почту из этой учетной записи, finger иногда сообщает, когда почта была получена и когда пользователь в последний раз получал ее:

New mail received Sun Sep 26 11:39 1999 (PDT)
Unread since Tue Sep 21 04:45 1999 (PDT)

Сервер finger может также сообщать о содержимом файла plan (план) и файла project (проект), если они существуют. Пользователи могут включать любую информацию в файл плана или проекта.

Также возможно получить информацию о пользователях, используя их настоящее имя или фамилию. Некоторые серверы finger требуют, чтобы вы использовали заглавные буквы в именах точно так, как они отображаются в файле входа или в файле, используемом онлайн-сервером finger, для получения информации о пользователе. Другие finger-серверы более либеральны в отношении капитализации. Сервер finger будет отвечать на запросы настоящего имени, возвращая все списки, соответствующие критериям запроса. Например, если на хосте несколько пользователей с именем zaphod, то ввод запроса

print read finger://Zaphod@main.example.com

будет извлекать всех таких пользователей, чье имя или фамилия Zaphod.

Некоторые серверы finger возвращают список пользователей, если имя пользователя опущено. Например,

print read finger://main.example.com

получает список всех пользователей, вошедших в систему, если это позволяет служба finger, установленная на хост-машине.

Некоторые хост-машины ограничивают сервисы finger по соображениям безопасности. Они могут потребовать действительное имя пользователя и вернуть только информацию об этом пользователе. Если вы укажете такой сервер без предоставления информации о пользователе, сервер сообщит, что ему требуется конкретная информация о пользователе.

If a system does not support the finger protocol, REBOL reports an access error:

print read finger://host.dom
connecting to: host.dom
Access Error: Cannot connect to host.dom.
Where: print read finger://host.dom

7. Daytime - протокол сетевого времени.

Дневной протокол извлекает текущий день и время. Чтобы подключиться к дневному серверу, используйте read (чтение) с URL. URL-адрес содержит имя сервера, с которого следует читать дату:

print read daytime://everest.cclabs.missouri.edu
Fri Jun 30 16:40:46 2000

Формат информации, возвращаемой серверами, может различаться в зависимости от сервера. Обратите внимание, что часовой пояс может отсутствовать.

Если выбранный вами сервер не поддерживает дневное время, REBOL возвращает ошибку:

print read daytime://www.example.com
connecting to: www.example.com
** Access Error: Cannot connect to www.example.com.
** Where: print read daytime://www.example.com

8. HTTP - протокол передачи гипертекста (Hyper Text Transfer Protocol)

Всемирная паутина управляется двумя фундаментальными технологиями: HTTP и HTML. HTTP - это протокол передачи гипертекста, который контролирует, как веб-серверы и веб-браузеры взаимодействуют друг с другом. HTML - это язык гипертекстовой разметки, который определяет структуру и содержимое веб-страницы.

Чтобы получить веб-страницу, браузер отправляет запрос на веб-сервер по протоколу HTTP. При получении запроса сервер интерпретирует его, иногда используя сценарий CGI (см. CGI - Общий интерфейс шлюза), и отправляет данные обратно. Эти данные могут быть чем угодно, включая HTML, текст, изображения, программы и звук.

8.1 Чтение веб-страницы

Чтобы прочитать веб-страницу, используйте функцию read (чтение) с URL-адресом HTTP. Например:

page: read http://www.rebol.com

Это вернет веб-страницу www.rebol.com. Обратите внимание, что при чтении возвращается строка, содержащая HTML-код страницы. Никакая графика или другая информация не загружаются. Для этого вам нужно будет предоставить дополнительные чтения. Страница может отображаться как HTML-код с помощью print, ее можно записать в файл с помощью write или отправить по электронной почте с помощью send.

print page

write %index.html page

send zaphod@example.com page

Страницу можно обрабатывать различными способами с помощью различных функций REBOL, таких как parse (синтаксический анализ), find (поиск) и load (загрузка).

Например, чтобы найти на веб-странице все вхождения слова REBOL, вы можете написать:

parse read http://www.rebol.com [
    any [to "REBOL" copy line to newline (print line)]
]

8.2 Скрипты на веб-сайтах

Веб-сервер может предоставлять больше, чем просто сценарии HTML. Веб-серверы также весьма полезны для предоставления сценариев REBOL.

Вы можете загружать сценарии REBOL прямо с веб-сервера с помощью load:

data: load http://www.rebol.com/data.r

Вы также можете оценивать скрипты прямо с сервера с помощью do:

data: do http://www.rebol.com/code.r

Предупреждение

Делайте это осторожно. Оценка произвольных сценариев на открытых серверах Интернета вызывает проблемы. Оценивайте сценарий только в том случае, если вы полностью доверяете его источнику, полностью проверили его источник или установили максимальные параметры безопасности REBOL.

Кроме того, веб-страницы, содержащие HTML, могут содержать встроенные сценарии REBOL, и их можно запускать с помощью:

data: do http://www.rebol.com/example.html

Чтобы определить, существует ли сценарий на странице перед его оценкой, используйте функцию script? (сценарий?).

if page: script? http://www.rebol.com [do page]

функция script? читает страницу с веб-сайта и возвращает страницу в позиции заголовка REBOL.

8.3 Загрузка страниц разметки

Страницы HTML и XML можно быстро преобразовать в блок REBOL с помощью функции load/markup (загрузки/разметки). Эта функция возвращает блок, состоящий из всех тегов и строк, найденных на странице. Все интервалы и разрывы строк остаются без изменений.

Чтобы отфильтровать все теги веб-страницы и просто распечатать её текст, введите:

tag-text: load/markup http://www.rebol.com
text: make string! 2000

foreach item tag-text [
    if string? item [append text item]
]

print text

Затем вы можете искать в этом тексте строковые шаблоны. Он будет содержать все пробелы и разрывы строк исходного HTML-файла.

Вот еще один пример, который проверяет все ссылки, найденные на веб-странице, чтобы убедиться, что страницы, на которые они ссылаются, существуют:

REBOL []

page: http://www.rebol.com/developer.html
set [path target] split-path page
system/options/quiet: true  ; turn off connection msgs
tag-text: load/markup page
links: make block! 100

foreach tag tag-text [  ; find all anchor href tags
    if tag? tag [
        if parse tag [
            "A" thru "HREF="
            [{"} copy link to {"} | copy link to ">"]
            to end
        ][
            append links link
        ]
    ]
]

print links

foreach link unique links [  ; try each link
    if all [
        link/1 <> #"#"
        any [flag: not find link ":"
             find/match link "http:"]
    ][
        link: either flag [path/:link][to-url link]
        prin [link "... "]
        print either error? try [read link]
            ["failed"]["OK"]
    ]
]

8.4 Другие функции

Чтобы проверить, существует ли веб-страница, используйте команду exists?, которая возвращает истину (true), если страница существует.

if exists? http://www.rebol.com [
    print "page still there"
]

Примечание. Во многих случаях обычно быстрее просто прочитать страницу, чем сначала проверить, существует ли она. В противном случае сценарий должен дважды связаться с сервером, что может занять много времени.

Чтобы запросить дату последнего изменения веб-страницы, используйте функция modified? (измененный?):

print modified? http://www.rebol.com/developer.html

Однако обратите внимание, что не все веб-серверы предоставляют информацию о дате изменения. Динамически генерируемые веб-страницы обычно не возвращают дату изменения.

Еще один способ определить, изменилась ли веб-страница, - это время от времени опрашивать ее и проверять. Удобный способ проверить, что веб-страница изменилась, - использовать функцию checksum (контрольная сумма). Если ранее вычисленная контрольная сумма веб-страницы отличается от ее текущего значения, значит, веб-страница была изменена с момента последней проверки. Вот пример, в котором используется эта техника. Он проверяет страницу каждые восемь часов.

forever [
    page: read http://www.rebol.com
    page-sum: checksum page
    if any [
        not exists? %page-sum
        page-sum <> (load %page-sum)
    ][
        print ["Page changed" now]
        save %page-sum page-sum
        send luke@rebol.com page
    ]
    wait 8:00
]

Каждый раз, когда страница изменяется, она отправляется Люку по электронной почте.

8.5 Действовать как браузер

Обычно REBOL идентифицирует себя для сервера при чтении с веб-сайта. Однако некоторые серверы запрограммированы так, чтобы отвечать только определенным браузерам. Если запрос к серверу не создает правильную веб-страницу, вы можете изменить запрос, чтобы он выглядел так, как будто он поступил из какого-либо другого типа веб-браузера. Многие программы притворяются веб-браузером, чтобы заставить веб-сайты правильно реагировать. Однако эта практика в конечном итоге сводит на нет цель идентификации браузера.

Чтобы изменить HTTP-запросы так, чтобы они выглядели так, как будто они отправляются Netscape 4.0, вы можете изменить пользовательский агент в обработчике HTTP:

system/options/http/user-agent: "Mozilla/4.0"

Установка этой переменной влияет на все последующие HTTP-запросы.

8.6 Отправка запросов CGI

Запросы HTTP CGI могут быть отправлены двумя способами. Вы можете включить данные запроса CGI в URL-адрес или предоставить данные запроса с помощью операции HTTP post.

В запросе URL CGI используется обычный URL. Пример ниже отправляет сценарию CGI test.r значение 10 переменной data.

read http://www.example.com/cgi-bin/test.r?data=10

Пост-запрос CGI требует, чтобы вы предоставили данные CGI как часть уточнения /custom функции чтения read. В приведенном ниже примере показано, как данные отправляются в CGI:

read/custom http://www.example.com/cgi-bin/test.r [
    post "data: 10"
]

В этом примере уточнение /custom используется для предоставления дополнительной информации для чтения. Второй аргумент - это блок, который начинается со слова post, за которым следует строка для отправки.

Метод post полезен для простой отправки кода и данных REBOL на веб-сервер, на котором работает CGI. Следующий пример иллюстрирует это:

data: [sell 10 shares of "ACME" at $123.45]

read/custom http://www.example.com/cgi-bin/test.r reduce [
    `post mold data
]

Функция mold создаст правильную строку REBOL, которая будет отправлена ​​на сервер.

9. SMTP - простой протокол передачи почты (Simple Mail Transport Protocol)

Простой протокол передачи почты (SMTP) контролирует передачу сообщений электронной почты в Интернете. SMTP определяет взаимодействие между интернет-узлами, которые участвуют в пересылке электронной почты от отправителя к месту назначения.

9.1 Отправка электронной почты

Электронная почта отправляется через SMTP с использованием функции send (отправка). Эта функция может отправить сообщение электронной почты на один или несколько адресов электронной почты.

Для правильной работы send необходимо настроить вашу сеть. Функция отправки send требует, чтобы вы указали свой адрес электронной почты От и почтовый сервер по умолчанию. См. Раздел «Начальна выше.

Функция отправки send принимает два аргумента: адрес электронной почты и сообщение. Например:

send user@example.com "Hi from REBOL"

Первый аргумент должен быть типом данных электронной почты или блока. Второй аргумент может быть любым типом данных.

send luke@rebol.com $1000.00

send luke@rebol.com 10:30:40

send luke@rebol.com bill@ms.dom

send luke@rebol.com [Today 9-Apr-99 10:30]

Каждое из этих простых сообщений электронной почты можно интерпретировать на стороне получателя (с помощью REBOL) или просмотреть с помощью обычной программы электронной почты.

Вы можете отправить файл целиком, прочитав файл и передав его в качестве второго аргумента функции отправки:

send luke@rebol.com read %task.txt

Двоичные данные, такие как изображение или исполняемый файл, также могут быть отправлены:

send luke@rebol.com read/binary %rebol

Двоичные данные закодированы, чтобы их можно было передавать в виде текста.

Чтобы отправить самораспаковывающееся двоичное сообщение, вы можете написать:

send luke@rebol.com join "REBOL for the job" [
    newline "REBOL []" newline
    "write/binary %rebol decompress "
    compress read/binary %rebol
]

Когда сообщение получено, файл можно извлечь с помощью функции do.

9.2 Несколько получателей

Для отправки нескольким получателям вы можете указать блок имен электронной почты:

send [luke@rebol.com ben@example.com] message

В этом случае каждое сообщение адресуется индивидуально, а в поле "Кому" (To) отображается только имя получателя (аналогично адресации BCC).

Блок адресов электронной почты может быть любого размера или даже быть загруженным вами файлом. Просто убедитесь, что это действительные адреса, а не строки. Строки игнорируются.

friends: [
    bob@cnn.dom
    betty@cnet.dom
    kirby@hooya.dom
    belle@apple.dom
    ...
]

send friends read %newsletter.txt

9.3 Массовая рассылка

Если вы отправляете электронную почту большой группе, вы можете снизить нагрузку на свой сервер, доставив всем в группе одно сообщение. Это цель уточнения /only. Он использует функцию SMTP для отправки только одного сообщения на несколько адресов электронной почты. Используя список друзей из предыдущего примера:

send/only friends message

Сообщения не адресуются индивидуально. Возможно, вы видели этот режим в некоторых массовых рассылках, которые вы получаете. Когда вы получаете массовую рассылку писем, ваш адрес не отображается в поле To (Кому).

Режим массовой рассылки SMTP следует использовать для списков рассылки, а не для рассылки спама. Электронная почта со спамом не является надлежащим сетевым этикетом, в некоторых странах и штатах она является незаконной, а спам приведет к блокировке вашего интернет-провайдера и других сайтов.

9.4 Тема и заголовки

По умолчанию функция send использует первую строку сообщения в качестве темы. Чтобы указать собственную строку темы, вам необходимо указать заголовок электронной почты для функции send. В дополнение к теме вы можете указать организацию, дату и даже свои собственные настраиваемые поля.

Чтобы включить заголовок, используйте уточнение /header функции send и включите объект заголовка. Объект заголовка должен быть создан из объекта system/standard/email. Например:

header: make system/standard/email [
    Subject: "Seen REBOL yet?"
    Organization: "Freedom Fighters"
]

Обратите внимание, что стандартные поля, такие как адрес From (От), не являются обязательными и автоматически предоставляются функцией send.

Затем заголовок предоставляется в качестве аргумента для send/header:

send/header friends message header

Электронное письмо выше отправляется с использованием настраиваемого заголовка для каждого сообщения.

9.5 Отладка ваших скриптов

При тестировании сценариев электронной почты рекомендуется сначала отправить электронное письмо самому себе, прежде чем отправлять его другим. Внимательно изучите тестовое электронное письмо, чтобы убедиться, что оно именно то, что вам нужно. Часто возникают такие ошибки, как отправка имени файла, а не его содержимого. Например, вы можете написать:

send person %the-data-file.txt

Это отправляет имя файла, а не сам файл.

10. POP - протокол почтового отделения (Post Office Protocol)

Протокол почтового отделения (POP) позволяет получать электронную почту, ожидающую в почтовом ящике почтового сервера. POP определяет ряд операций для доступа и хранения электронной почты на вашем сервере.

10.1 Чтение электронной почты

Вы можете прочитать всю свою электронную почту в одной строке, не удаляя ее с почтового сервера: это делается путем чтения из URL-адреса POP, в котором вы указали свое имя пользователя, пароль и адрес электронной почты.

mail: read pop://user:pass@mail.example.com

Сообщения возвращаются в виде блока строк, который вы можете обрабатывать по одному сообщению за раз, используя такой код, как:

foreach message mail [print message]

Чтобы читать отдельные сообщения электронной почты с сервера, вам необходимо открыть соединение порта с сервером и обрабатывать каждое сообщение по одному. Чтобы открыть порт POP:

mailbox: open pop://user:pass@mail.example.com

В этом примере доступ к mailbox (почтовому ящику) можно получить как серию. Он отвечает на многие стандартные функции серии, такие как length? (длина?), first (первый), second (второй), third (третий), pick (выбрать), next (следующий), back (назад), head (голова), tail (хвост), head? (голова?) , tail? (хвост?), remove (удалить) и clear (очистить).

Чтобы определить количество почтовых сообщений, находящихся на сервере, используйте length? (длина?) функция.

print length? mailbox
37

Кроме того, вы можете узнать общий размер всех сообщений и отдельные размеры сообщений с помощью:

print mailbox/locals/total-size

print mailbox/locals/sizes

Чтобы отобразить первое, второе и последнее сообщение, вы можете написать:

print first mailbox

print second mailbox

print last mailbox

Вы также можете использовать pick, чтобы получить конкретное сообщение:

print pick mailbox 27

Вы можете получать и отображать каждое сообщение от самого старого до самого нового, используя цикл, идентичный тому, который используется для других типов серий:

while [not tail? mailbox] [
    print first mailbox
    mailbox: next mailbox
]

Вы также можете читать свою электронную почту от самой новой до самой старой с помощью цикла, например:

mailbox: tail mailbox

while [not head? mailbox] [
    mailbox: back mailbox
    print first mailbox
]

Когда вы закончите, не забудьте закрыть (close) почтовый ящик (mailbox). Это можно сделать с помощью такой строки, как:

close mailbox

10.2 Удаление электронной почты

Как и в случае с сериями, функцию remove (удаления) можно использовать для удаления одного сообщения, а функцию clear (очистка) можно использовать для удаления всех сообщений от текущей позиции до конца почтового ящика.

Например, чтобы прочитать сообщение, сохранить его в файл и удалить с сервера:

mailbox: open pop://user:pass@mail.example.com
write %mail.txt first mailbox
remove mailbox
close mailbox

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

Чтобы удалить 22-е сообщение электронной почты с сервера, вы можете написать:

user:pass@mail.example.com
remove at mailbox 22
close mailbox

Вы можете удалить ряд сообщений, используя уточнение /part с функцией удаления (remove):

remove/part mailbox 5

Чтобы удалить все сообщения в почтовом ящике, используйте функцию clear (очистка):

mailbox: open pop://user:pass@example.com
clear mailbox
close mailbox

функция clear также может быть использована в различных позициях в почтовом ящике, чтобы удалить сообщения в конце почтового ящика.

10.3 Обработка заголовков электронной почты

Сообщения электронной почты всегда включают заголовок. Заголовок содержит такую ​​информацию, как отправитель, получатель, тема, дата и другие поля.

В REBOL заголовки электронной почты обрабатываются как объекты, содержащие все необходимые поля. Чтобы преобразовать сообщение электронной почты в объект заголовка, вы можете использовать функцию import-email. Например:

msg: import-email first mailbox

print first msg/from  ; the email address
print msg/date
print msg/subject
print msg/content

Вы можете легко написать фильтр, который сканирует вашу электронную почту на предмет сообщений, начинающихся с определенной строки темы:

mailbox: open pop://user:pass@example.com

while [not tail? mailbox] [
    msg: import-email first mailbox
    if find/match msg/subject "[REBOL]" [
        print msg/subject
    ]
    mailbox: next mailbox
]

close mailbox

Вот еще один пример, который информирует вас о получении электронного письма от группы друзей:

friends: [orson@rebol.com hans@rebol.com]

messages: read pop://user:pass@example.com

foreach message messages [
    msg: import-email message
    if find friends first msg/from [
        print [msg/from newline msg/content]
        send first msg/from "Got your email!"
    ]
]

Этот спам-фильтр удаляет с сервера все сообщения, в которых отсутствует ваше имя электронной почты:

mailbox: open pop://user:pass@example.com

while [not tail? mailbox] [
    mailbox: either find first mailbox user@example.com
        [next mailbox][remove mailbox]
]

close mailbox

Вот простой сервер списков рассылки, который принимает сообщения и отправляет их группе. Сервер принимает электронную почту только от людей в группе.

group: [orson@rebol.com hans@rebol.com]

mailbox: open pop://user:pass@example.com

while [not tail? mailbox] [
    message: import-email first mailbox
    mailbox: either find group first message/from [
        send/only group first mailbox
        remove mailbox
    ][next mailbox]
]

close mailbox

11. FTP - протокол передачи файлов (File Transfer Protocol)

Протокол передачи файлов (FTP) широко используется в Интернете для передачи файлов на удаленный хост и с него. FTP обычно используется для загрузки страниц на веб-сайт и для предоставления онлайн-архивов файлов.

11.1 Использование FTP

В REBOL операции с файлами FTP обрабатываются почти так же, как операции с локальными файлами. Такие функции, как read (чтение), write (запись), load (загрузка), save (сохранение), do (выполнение), open (открытие), close (закрытие), exists? (существуют?), size? (размер?), modified? (модифицированный?), и другие используются с FTP. REBOL различает локальные файлы и файлы, доступные по FTP через FTP-URL.

Доступ к FTP-серверам может быть открытым или закрытым. Открытый доступ позволяет любому войти на сайт и скачивать файлы. Это называется анонимным доступом и часто используется для общедоступных файловых архивов. Закрытый доступ требует, чтобы вы указали имя пользователя и пароль для загрузки и выгрузки файлов. Это режим работы для загрузки веб-страниц на веб-сайт.

Хотя FTP не требует настройки вашей сети REBOL, если вы хотите использовать анонимный доступ, требуется адрес электронной почты. Этот адрес находится в объекте system/user/email. Обычно, когда вы загружаете REBOL, это поле устанавливается из вашего пользовательского файла user.r. См. Дополнительные сведения в разделе « Начальная настройка».

Если вы используете FTP через прокси-сервер или брандмауэр, возможно, FTP должен работать в пассивном режиме. Пассивный режим не требует обратных подключений от FTP-сервера к клиенту для передачи данных. Этот режим устанавливает только исходящие соединения с вашего компьютера и обеспечивает более высокий уровень безопасности. Для включения пассивного режима вам необходимо установить флаг в обработчике протокола FTP:

system/schemes/ftp/passive: true

Если вы не знаете, нужно ли это, сначала попробуйте FTP без него. Если это не сработает, попробуйте установить пассивный флаг.

11.2 URL-адреса FTP

URL-адрес FTP имеет базовую форму:

ftp://user:pass@host/directory/file

Для анонимного доступа имя пользователя и пароль можно не указывать:

ftp://host/directory/file

В большинстве примеров в этом разделе для простоты используется эта форма; однако они также работают с именем пользователя и паролем.

Чтобы получить доступ к удаленному каталогу, завершите URL-адрес косой чертой, например::

ftp://user:pass@host/directory/

ftp://host/directory/

ftp://host/

Подробнее о доступе к каталогу показано ниже.

Удобно поместить URL-адрес в переменную и использовать пути для указания имен файлов. Это позволяет вам ссылаться на URL-адрес одним словом. Например:

site: ftp://ftp.rebol.com/pub/

read site/readme.txt

Этот метод используется в некоторых следующих разделах.

11.3 Передача текстовых файлов

FTP различает текстовые файлы и двоичные файлы. При передаче текстовых файлов FTP преобразует символы разрыва строки. Это нежелательно для двоичных файлов.

Чтобы прочитать текстовый файл, укажите для функции read (чтение) URL-адрес FTP:

file: read ftp://ftp.site.com/file.r

Это помещает содержимое файла в строку. Чтобы записать файл локально, используйте эту строку:

write %file.r read ftp://ftp.site.com/file.r

Также можно использовать многие из усовершенствований read. Например, вы можете использовать read/lines с:

data: read/lines ftp://ftp.site.com/file.r

В этом примере возвращается блок строк для файла. См. Главу «Файлы» для получения дополнительной информации об усовершенствованиях функции read.

Чтобы записать текстовый файл на сервер, используйте функцию write (запись):

write ftp://ftp.site.com/file.r read %file.r

Функция записи (write) также может включать уточнения. См. Главу "Файлы".

Как и при обычной передаче текстовых файлов, все окончания строк будут правильно преобразованы во время передачи по FTP.

Вот простой сценарий, который обновляет файлы на вашем веб-сайте:

site: ftp://wwwuser:secret@www.site.dom/pages

files: [%index.html %home.html %info.html]

foreach file files [write site/:file read file]

Его не следует использовать для передачи графических или звуковых файлов, поскольку они являются двоичными. Используйте технику, показанную в разделе «Передача двоичных файлов».

В дополнение к функциям чтения (read) и записи (write) вы можете использовать функции загрузки (load), сохранения (write) и выполнения (do) с FTP.

data: load ftp://ftp.site.com/database.r

save ftp://ftp.site.com/data.r data-block

do ftp://ftp.site.com/scripts/test.r

11.4 Передача двоичных файлов

Чтобы избежать преобразования окончания строки при передаче двоичных файлов (изображений, архивов, исполняемых файлов), используйте уточнение /binary. Например, чтобы прочитать двоичный файл с FTP-сервера:

data: read/binary ftp://ftp.site.com/file

Чтобы сделать локальную копию файла:

write/binary %file read/binary ftp://ftp.site.com/file

Чтобы сделать локальную копию файла:

write/binary ftp://ftp.site.com/file read/binary %file

Преобразования завершения строки не выполняются.

Чтобы передать набор графических файлов на веб-сайт, используйте этот сценарий:

site: ftp://user:pass@ftp.site.com/www/graphics

files: [%icon.gif %logo.gif %photo.jpg]

foreach file files [
    write/binary site/:file read/binary file
]

11.5 Добавление к файлам

FTP также позволяет добавлять текст и данные в существующий файл. Для этого используйте уточнение write/append (запись/добавление), как описано в главе «Файлы».

write/append ftp://ftp.site.com/pub/log.txt reform
    ["Log entry date:" now newline]

Это также можно использовать с двоичными файлами.

write/binary/append ftp://ftp.site.com/pub/log.txt
    read/binary %datafile

11.6 Чтение каталогов

Чтобы прочитать имена файлов в каталоге FTP, после имени каталога используйте косую черту:

print read ftp://ftp.site.com/

pub-files: read ftp://ftp.site.com/pub/

Конечная косая черта (/) указывает, что это доступ к каталогу, а не к файлу. Косая черта не всегда требуется, но рекомендуется, если вы знаете, что получаете доступ к каталогу.

Возвращаемый блок файлов включает все файлы в каталоге. В этом блоке имена каталогов обозначаются косой чертой после их имен. Например:

foreach file read ftp://ftp.site.com/pub/ [
    print file
]
readme.txt
rebol.r
rebol.exe
library/docs/

Вы также можете использовать dir? над файлом, чтобы определить, является ли он каталогом.

11.7 Информация о файле

Те же функции, которые предоставляют информацию о файлах, также предоставляют информацию о файлах FTP. Сюда входит modified? (модифицированный?), size? (размер?), exists? (существует?), dir? (директорий?) и info? (информация?) функции.

Вы можете использовать функцию exists?, чтобы определить, существует ли файл:

if exists? ftp://ftp.site.com/pub/log.txt [
    print "Log file is there"
]

Это также работает для каталогов, но включает косую черту в конце имени каталога:

if exists? ftp://ftp.site.com/pub/rebol/ [
    print read ftp://ftp.site.com/pub/rebol/
]

Чтобы получить размер или дату изменения файла:

print size? ftp://ftp.site.com/pub/log.txt

print modified? ftp://ftp.site.com/pub/log.txt

Чтобы определить, действительно ли файл является каталогом:

if dir? ftp://ftp.site.com/pub/text [
    print "It's a directory"
]

Вы можете получить всю эту информацию в едином доступе с помощью info? функция:

file-info: info? ftp://ftp.site.com/pub/log.txt

probe file-info

print file-info/size

Чтобы выполнить ту же операцию с каталогом:

probe info? ftp://ftp.site.com/pub/

Чтобы распечатать список каталогов:

files: open ftp://ftp.site.com/pub/

forall files [
    file: first files
    info: info? file
    print [file info/date info/size info/type]
]

11.8 Создание каталогов

Новые каталоги FTP можно создать с помощью функции make-dir:

make-dir ftp://user:pass@ftp.site.com/newdir/

11.9 Удаление файлов

При соответствующих настройках разрешений файлы могут быть удалены с удаленного FTP-сервера с помощью функции delete (удаление):

delete ftp://user:pass@ftp.site.com/upload.txt

Вы также можете удалить каталоги:

delete ftp://user:pass@ftp.site.com/newdir/

Обратите внимание, что для этого каталог должен быть пустым.

11.10 Переименование файлов

Вы можете переименовать файл используя функцию rename:

rename ftp://user:pass@ftp.site.com/foo.r %bar.r

Новое имя файла будет bar.r.

FTP также позволяет переместить файл в другой каталог с помощью:

rename ftp://user:pass@ftp.site.com/foo.r %pub/bar.r

Чтобы переименовать каталог на FTP-сайте, не забудьте поставить после имени каталога косую черту:

rename ftp://user:pass@ftp.site.com/rebol/ rebol-old/

11.11 О паролях

Приведенные выше примеры включают пароль в свои URL-адреса, но если вы планируете поделиться своим скриптом, вы, вероятно, не хотите, чтобы эта информация была известна. Вот простой способ запросить пароль и создать правильный URL:

pass: ask "Password? "

data: read join ftp://user: [pass "@ftp.site.com/file"]

Или вы можете запросить имя пользователя и пароль:

user: ask "Username? "
pass: ask "Password? "
data: read join ftp:// [
    user ":" pass "@ftp.site.com/file"
]

Вы также можете открывать FTP-соединения, используя спецификацию порта, а не URL-адрес. Это позволяет использовать любой пароль, даже те, которые содержат специальные символы, которые нелегко записать в URL-адресах. Пример спецификации порта для открытия FTP-соединения:

ftp-port: open [
    scheme: `ftp
    host: "ftp.site.com"
    user: ask "Username? "
    pass: ask "Password? "
]

См. «Указание сетевых ресурсов» выше для получения более подробной информации.

11.12 Передача больших файлов

Передача больших файлов требует особого внимания. Вы можете передавать файл по частям, чтобы уменьшить объем памяти, необходимый вашему компьютеру, и обеспечить обратную связь с пользователем во время передачи.

Вот пример, который загружает очень большой двоичный файл по частям.

inp: open/binary/direct ftp://ftp.site.com/big-file.bmp
out: open/binary/new/direct %big-file.bmp
buf-size: 200000
buffer: make binary! buf-size + 2

while [not zero? size: read-io inp buffer buf-size][
    write-io out buffer size
    total: total + size
    print ["transferred:" total]
]

Обязательно используйте уточнение /direct, иначе весь файл будет буферизован внутренне REBOL. Функции read-io и write-io позволяют повторно использовать уже выделенную буферную память. Другие функции, такие как copy (копирование), выделяют дополнительную память.

Если передача не удалась, вы можете перезапустить FTP с того места, где она была прервана. Для этого изучите выходной файл или переменную размера, чтобы определить, где перезапустить передачу. Откройте файл еще раз с уточнением /custom (настраиваемым), которое указывает restart (перезапуск) и расположение, с которого следует начать чтение. Вот пример функции open для использования, когда переменная total указывает уже прочитанную длину:

inp: open/binary/direct/custom
    ftp://ftp.site.com/big-file.bmp
    reduce ['restart total]

Обратите внимание, что перезапуск работает только для двоичных передач. Его нельзя использовать с передачей текста, потому что выполняемое преобразование ограничителя строки приведет к неправильным смещениям.

12. NNTP - протокол передачи сетевых новостей (Network News Transfer Protocol)

Протокол передачи сетевых новостей (NNTP) является основой для десятков тысяч групп новостей, которые обеспечивают общественный форум для миллионов пользователей Интернета. REBOL включает два уровня поддержки NNTP.

Встроенная поддержка NNTP, обеспечивающая очень ограниченную функциональность и доступ. Это схема NTTP.

Расширенный уровень функциональности, обеспечиваемый схемой новостей, реализованной в файле, распространяемом как nntp.r.

12.1 Чтение списка групп новостей

NNTP состоит из двух компонентов: списка групп новостей, поддерживаемых определенным сервером группы новостей (группы новостей обычно выбираются поставщиком услуг Интернета); и база данных сообщений, которые в настоящее время доступны для любой конкретной группы новостей.

Чтобы получить список всех групп новостей с определенного сервера новостей, используйте функцию read (чтение) с URL-адресом NNTP, например:

groups: read nntp://news.example.com

Это может занять некоторое время, в зависимости от вашего подключения; есть тысячи групп новостей.

12.2 Чтение всех сообщений

Если вы используете быстрое соединение, вы можете прочитать все ожидающие сообщения для группы новостей с помощью:

messages: read nntp://news.example.com/alt.test

Однако рекомендуется соблюдать осторожность. Некоторые группы новостей могут содержать тысячи сообщений. Загрузка всех сообщений может занять много времени, и вам может не хватить памяти для их хранения.

12.3 Чтение одиночных сообщений

Чтобы читать отдельные сообщения, откройте NNTP как порт и используйте последовательные функции для доступа к сообщениям. Это похоже на то, как вы читаете электронную почту через порт POP. Например:

group: open nntp://news.example.com/alt.test

Вы можете использовать функцию length? (длина?) для определения количества сообщений, доступных в группе новостей:

print length? group

Чтобы прочитать первое сообщение, доступное в группе новостей, используйте first:

message: first group

Чтобы выбрать конкретное сообщение в группе по индексу, используйте команду pick:

message: pick group 37

Чтобы создать простой цикл, который просматривает все сообщения на предмет ключевого слова, используйте:

forall group [
    if find msg: first first group "REBOL" [
        print msg
    ]
]

Помните, что когда цикл завершается, указатель сериии group располагается в хвосте. Если нужно вернуться к началу группы:

group: head group

Обязательно закройте (close) порт, когда закончите его использовать:

close group

12.4 Обработка заголовков новостей

Новостные сообщения всегда включают заголовок. Заголовок содержит такую ​​информацию, как отправитель, сводка, ключевые слова, тема, дата и другие поля.

Заголовки обрабатываются как объекты. Чтобы преобразовать новостное сообщение в объект заголовка новости, вы можете использовать функцию import-email. Например:

message: first first group
header: import-email message

Теперь вы можете получить доступ к полям новостного сообщения:

print [header/from header/subject header/date]

Разные группы новостей и клиенты групп новостей используют разные поля в своих заголовках. Чтобы просмотреть поля, доступные для конкретного сообщения, отобразите первый элемент объекта заголовка:

print first header

12.5 Отправка новостного сообщения

Прежде чем вы сможете отправить новостное сообщение, вам необходимо создать для него заголовок. Вот общий заголовок, который можно использовать для новостей:

news-header: make object! [
    Path: "not-for-mail"
    Sender: Reply-to: From: system/user/email
    Subject: "Test message"
    Newsgroups: "alt.test"
    Message-ID: none
    Organization: "Docs For All"
    Keywords: "Test"
    Summary: "A test message"
]

Прежде чем вы сможете его отправить, вам необходимо создать для него уникальный глобальный идентификационный номер. Вот функция, которая это делает:

make-id: does [
    rejoin [
        "<"
        system/user/email/user
        "."
        checksum form now
        "."
        random 999999
        "@"
        read dns://
        ">"
    ]
]

print news-header/message-id: make-id
<carl.4959961.534798@fred.example.com>

Теперь вы можете объединить заголовок с сообщением. Они должны быть разделены хотя бы одной пустой строкой. Содержание сообщения читается из файла.

write nntp://news.example.net/alt.test rejoin [
    net-utils/export news-header
    newline newline
    read %message.txt
    newline
]

13. CGI - Общий интерфейс шлюза (Common Gateway Interface)

Общий интерфейс шлюза используется со многими веб-серверами для обеспечения обработки, выходящей за рамки обычного веб-интерфейса HTTP. Запросы CGI отправляются из веб-браузеров на веб-серверы. Когда сервер получает запрос CGI, он обычно выполняет сценарий для обработки запроса и возврата результата в браузер. Эти сценарии CGI могут быть написаны на разных языках, и REBOL предоставляет один из наиболее простых способов работы с CGI.

13.1 Настройка сервера CGI

Настройка доступа CGI отличается для каждого веб-сервера. См. Инструкции, прилагаемые к вашему серверу.

Обычно сервер имеет возможность включить работу CGI. Вам необходимо включить эту опцию и указать путь к каталогу, в котором находятся ваши сценарии CGI. Общий каталог для сценариев CGI находится в cgi-bin.

На серверах Apache опция ExecCGI включает сценарии CGI, и вы можете предоставить каталог (cgi-bin) для своих сценариев. Обычно это устанавливается при установке Apache по умолчанию.

Чтобы настроить CGI для Microsoft IIS, перейдите в свойства cgi-bin и нажмите кнопку конфигурации. На панели конфигурации нажмите «Добавить» и введите путь к вашему файлу rebol .exe. Формат для этого:

C:\rebol\rebol.exe -cs %s %s

Два символа %s необходимы для правильной передачи аргументов сценария и командной строки в REBOL. Добавьте расширение для файлов REBOL (.r) и установите последнее поле в PUT, DELETE. Механизм сценария выбирать не нужно.

Параметр -cs, предоставляемый REBOL, включает работу CGI и позволяет сценарию получить доступ ко всем файлам. (!! См. Примечания ниже о том, как сценарии могут ограничивать доступ к файлам для выбранных каталогов).

С веб-серверами, отличными от описанных выше, серверу требуется конфигурация для выполнения исполняемого файла REBOL для .r и запустите REBOL с необходимой опцией -cs.

13.2 Скрипты CGI

Прежде чем сценарий может быть запущен на большинстве серверов CGI, он должен иметь правильные права доступа к файлам. В системах типа UNIX или тех, которые используют сервер Apache, вам необходимо изменить разрешения, чтобы сценарий был доступен для чтения и выполнения всеми пользователями. Это можно сделать с помощью функции chmod. Если вы новичок в этой концепции, вам следует прочитать руководство по своей операционной системе или поговорить с системным администратором, прежде чем изменять права доступа к файлам.

Чтобы Apache и другие веб-серверы могли запускать сценарии REBOL, вам необходимо указать правильный заголовок в верхней части каждого файла сценария. В заголовке указывается путь к исполняемому файлу REBOL и опция -cs. За ним может следовать обычный заголовок сценария REBOL. Вот простой сценарий CGI, который печатает строку, hello!.

#!/path/to/rebol -cs

REBOL [Title: "CGI Test Script"]

print "Content-Type: text/plain"

print ""  ; required

print "Hello!"

Есть много вещей, которые мешают правильной работе CGI-скрипта. Прежде чем пробовать более сложные сценарии, запустите этот простой сценарий. Если ваш сценарий не работает, проверьте следующее: * На вашем веб-сервере включен CGI. * Первая строка начинается с #! и правильный путь к REBOL. * Опция -cs входит в REBOL. * Сценарий начинается с печати «Content-Type:». (!!см. ниже) * Скрипт находится в правильном каталоге. (обычноcgi-bin каталог) * У скрипта есть правильные права доступа к файлу (все могут читать и исполнять). * Сценарий содержит правильные символы разрыва строки. Некоторые серверы не запускают сценарии, содержащие символ CR для разрыва строки. Возможно, вам потребуется преобразовать файл. (Используйте REBOL, чтобы сделать это в одну строку: записать файл, прочитать файл). * Скрипт не содержит ошибок. Протестируйте его без CGI, чтобы убедиться, что скрипт загружается (не имеет синтаксических ошибок) и работает правильно. Предоставьте образцы данных и проверьте их. * Все файлы, к которым обращается сценарий, имеют правильные права доступа к файлам.

Часто один или несколько из вышеперечисленных пунктов неверны и мешают запуску вашего скрипта. Вы можете увидеть ошибку при просмотре веб-страницы. Если там написано «Ошибка сервера» или «Ошибка CGI», то обычно это связано с разрешениями или настройкой скрипта. Если отображается сообщение об ошибке REBOL, значит, сценарий запущен, но в нем есть ошибка.

В примере сценария, показанном выше, критически важна строка Content-Type. Это часть HTTP-заголовка, который возвращается браузеру, и он сообщает браузеру тип доставляемого контента. После этого следует пустая строка, чтобы отделить ее от фактического содержимого.

Может быть доставлено много различных типов контента. Предыдущий пример был простым текстом, но вы также можете доставлять HTML, как показано в следующем примере. (Дополнительную информацию о типах содержимого см. В руководстве к веб-серверу.)

Тип содержимого и пустую строку можно объединить в одну строку. Символ каретки (^/) обеспечивает дополнительный разрыв строки, чтобы отделить его от содержимого.

print "Content-Type: text/plain^/"

Рекомендуется всегда выводить эту строку сразу из сценария. Это позволяет браузеру видеть сообщения об ошибках, если ваш скрипт обнаруживает ошибку.

Вот простой CGI-скрипт, который печатает время:

#!/path/to/rebol -cs

REBOL [Title: "Time Script"]

print "Content-Type: text/plain^/"

print ["The time is now" now/time]

13.3 Создание HTML-содержимого

Существует столько же способов создания содержимого HTML, сколько способов создания строк. Эта страница создает страницу, на которой отображается счетчик посещений страницы:

#!/path/to/rebol -cs

REBOL [Title: "HTML Example"]

print "Content-Type: text/html^/"

count: either exists? %counter [load %counter][0]
save %counter count: count + 1

print [
    {<HTML><BODY><H2>Web Counter Page</H2>
    You are visitor} count {to this page!<P>
    </BODY></HTML>}
]

Сценарий в приведенном выше примере загружается и сохраняет в текстовый файл счетчика. Для того, чтобы этот файл был доступен, необходимо установить соответствующие разрешения, чтобы разрешить доступ всем пользователям.

13.4 Среда CGI

Когда запускается сценарий CGI, сервер предоставляет REBOL информацию о запросе CGI и его аргументах. Вся эта информация предоставляется в виде объекта в объекте system/options. Чтобы просмотреть поля объекта, введите:

probe system/options/cgi
make object! [
    server-software: none
    server-name: none
    gateway-interface: none
    server-protocol: none
    server-port: none
    request-method: none
    path-info: none
    path-translated: none
    script-name: none
    query-string: none
    remote-host: none
    remote-addr: none
    auth-type: none
    remote-user: none
    remote-ident: none
    Content-Type: none
    content-length: none
    other-headers: []
]

Конечно, ваш сценарий проигнорирует большую часть этой информации, но некоторые из них могут быть полезны. Например, вы можете создать файл журнала, в котором будет записан сетевой адрес системы, отправившей запрос, или проверить тип используемого браузера.

Чтобы создать CGI-страницу, отображающую этот контент в вашем браузере:

#!/path/to/rebol -cs

REBOL [Title: "Dump CGI Server Variables"]

print "Content-Type: text/plain^/"

print "Server Variables:"

probe system/options/cgi

Если вы хотите использовать эту информацию в журнале, вы можете записать ее в файл. Например, чтобы регистрировать адреса посетителей вашей CGI-страницы, вы можете написать:

write/append/lines %cgi.log
    system/options/cgi/remote-addr

/Append и /lines уточнения вызывает запись, чтобы быть в хвосте файла и включает в себя разрыв строки. Вот еще один подход, при котором несколько элементов помещаются в одну строку:

write/append %cgi.log reform [
    system/options/cgi/remote-addr
    system/options/cgi/remote-ident
    system/options/cgi/content-type
    newline
]

13.5 Запросы CGI

CGI может предоставить данные запроса вашим скриптам двумя способами: GET и POST.

Метод GET кодирует данные CGI в URL-адрес. Это используется для предоставления информации серверу. Возможно, вы уже заметили, что некоторые URL-адреса выглядят так::

http://www.example.com/cgi-bin/test.r?&data=test

Строка, следующая за вопросительным знаком (?), Предоставляет аргументы CGI. Иногда они могут быть довольно длинными. Эта строка предоставляется вашему скрипту при его запуске. Его можно получить из поля cgi/query-string. Например, чтобы распечатать строку из скрипта:

print system/options/cgi/query-string

Данные в строке могут включать любые требуемые данные. Однако, поскольку строка является частью URL-адреса, данные должны быть закодированы. Существуют ограничения на разрешенные символы.

Кроме того, когда данные создаются HTML-формами, они кодируются стандартным способом. Эти данные могут быть декодированы и помещены в объект с помощью кода:

cgi: make object! decode-cgi-query
    system/options/cgi/query-string

Функция decode-cgi-query возвращает блок, содержащий имена переменных и их значения. См. Пример HTML-формы в следующем разделе.

Метод POST предоставляет данные CGI в виде строки. Данные не нужно кодировать. Он может быть в любом желаемом формате и даже в двоичном формате. Почтовые данные считываются со стандартного устройства ввода. Вам нужно будет прочитать его из ввода с помощью такой строки, как:

data: make string! 2002
read-io system/ports/input data 2000

Это будет читать до первых 2000 байтов данных POST и помещать их в строку.

Хороший формат для данных POST - использовать диалект REBOL и создать простой синтаксический анализатор. Данные POST можно загружать и анализировать как блок. См. Главу «Анализ».

Предупреждение о блоках

Не рекомендуется передавать блоки REBOL для непосредственной оценки, поскольку это может представлять угрозу безопасности. Например, кто-то может POST блок, который читает или удаляет файлы на сервере. Однако можно безопасно передавать блоки, которые интерпретируются вашим скриптом (диалектом).

Вот пример сценария, который отображает данные публикации в вашем браузере:

#!/path/to/rebol -cs

REBOL [Title: "Show POST data"]

print "Content-Type: text/html^/"
data: make string! 10000
foreach line copy system/ports/input [
    repend data [line newline]
]

print [
    <HTML><BODY>
    {Here is the posted data.}
    <HR><PRE>data</PRE>
    </BODY></HTML>
]

13.6 Обработка HTML-форм

CGI часто используется для обработки HTML-форм. Формы принимают ввод из различных полей и отправляют их на веб-сервер как HTML-метод get или post.

Вот пример, который использует CGI get для обработки формы и отправки электронного письма в результате. Это состоит из двух частей: HTML-страницы и CGI-скрипта.

Вот HTML-страница, содержащая форму:

<HTML><BODY>

<FORM ACTION="http://example.com/cgi-bin/send.r" METHOD="GET">

<H1>CGI Emailer</H1><HR>

Enter your email address:<P>

<INPUT TYPE="TEXT" NAME="email" SIZE="30"><P>

<TEXTAREA NAME="message" ROWS="7" COLS="35">
Enter message here.
</TEXTAREA><P>

<INPUT TYPE="SUBMIT" VALUE="Submit">

</FORM>
</BODY></HTML>

При отправке вышеуказанного сценария ему требуется сценарий CGI для обработки его результатов. Вот пример такого сценария. Этот пример сценария декодирует данные формы и отправляет электронное письмо. Он возвращает страницу подтверждения.

#!/path/to/rebol -cs

REBOL [Title: "Send CGI Email"]

print "Content-Type: text/html^/"

cgi: make object! decode-cgi-query
    system/options/cgi/query-string

print {<HTML><BODY><H1>Email Status</H1><HR><P>}

failed: error? try [send to-email cgi/email cgi/message]

print either failed [
    {The email could not be sent.}
][
    [{The email to} cgi/email {was sent.}]
]

print {</BODY><HTML>}

Этот сценарий должен называться send.r и храниться в каталоге cgi-bin. Его разрешения должны быть доступны для чтения и выполнения для всех.

Этот сценарий будет запущен после отправки формы браузером. Он декодирует строку запроса CGI в объект cgi. Теперь у объекта есть переменные электронной почты и сообщения, которые используются для функции send (отправка). Перед отправкой поле электронной почты преобразуется из строки в тип данных email (электронной почты).

Функция send помещается в блок try, чтобы отловить ошибки, если они возникают при отправке электронного письма. Для переменной с ошибкой устанавливается значение true, если произошла ошибка, и создается соответствующее сообщение.

Другие примеры CGI можно найти в библиотеке сценариев REBOL по адресу http://www.rebol.com/library/library.html.

14. TCP - протокол управления передачей (Transmission Control Protocol)

В дополнение к ранее описанным протоколам вы можете создавать свои собственные сетевые серверы и клиенты с протоколом управления передачей TCP.

14.1 Создание клиентов

TCP-порты можно открывать так же, как и другие протоколы REBOL, используя TCP-URL. Чтобы открыть TCP-соединение с HTTP (веб-сервером) на TCP-порту 80:

http-port: open tcp://www.example.com:80

Другой способ открытия TCP-соединения - напрямую указать спецификацию порта. Это замена URL-адреса и часто бывает весьма полезной:

http-port: open [
    scheme: 'tcp
    host: "www.example.com"
    port-id: 80
]

Поскольку порты являются последовательными, вы можете использовать одни и те же последовательные функции для отправки и получения данных. В приведенном ниже примере запрашивается HTTP-сервер, открытый в предыдущем примере. Он использует функцию insert (вставвить) для помещения данных в серию портов, которая отправляет их на сервер:

insert http-port "GET / HTTP/1.0^/^/"

Два символа новой строки используются, чтобы сообщить серверу, что заголовок был отправлен.

Символы новой строки автоматически преобразуются в последовательности CR LF, поскольку порт был открыт в текстовом режиме.

Всервер обрабатывает HTTP-запрос и возвращает результат в портов серию. Чтобы прочитать результат, воспользуйтесь функцией copy:

while [data: copy http-port] [prin data]

Этот цикл будет продолжать выборку данных до тех пор, пока из копии не будет возвращено none. Это поведение различается в зависимости от протокола. Нет возвращается, потому что сервер закрывает соединение. Другие протоколы могут отправлять специальный символ для обозначения конца передачи.

Теперь, когда все данные получены, следует закрыть HTTP-порт:

close http-port

Вот еще один пример подключения к порту POP на сервере:

pop: open/lines tcp://fred.example.com:110

В этом примере используется уточнение /lines. Теперь соединение будет линейным. Данные будут записаны и прочитаны как строки. Чтобы прочитать первую строку с сервера:

print first pop
+OK QPOP (version 2.53) at fred.example.com starting.

Чтобы отправить серверу имя пользователя для входа в систему по протоколу POP:

insert pop "user carl"

Поскольку порт работает в линейном режиме, терминатор строки отправляется после вставки. Ответ сервера можно прочитать с помощью:

print first pop
+OK Password required for carl.

А в остальном общение будет происходить следующим образом:

insert pop "pass secret"

print first pop
+OK carl has 0 messages (0 octets).
insert pop "quit"

first pop
+OK Pop server at fred.example.com signing off.

Теперь соединение должно быть закрыто:

close pop

14.2 Создание серверов

Чтобы создать сервер, вам нужно дождаться соединений и отвечать на них по мере их возникновения. Чтобы настроить порт на вашем компьютере, который можно использовать для ожидания входящих подключений:

listen: open tcp://:8001

Обратите внимание, что вы не указываете имя хоста, а только номер порта. Этот тип порта называется портом listen. Теперь система принимает соединения через порт 8001.

Чтобы дождаться соединения с другой машиной, выполните wait на слушающем порту.

wait listen

Эта функция не возвращается, пока не будет установлено соединение.

ПРИМЕЧАНИЕ. Есть и другие варианты ожидания (wait ). Например, вы можете подождать на нескольких портах или на тайм-аут.

Теперь вы можете открыть порт подключения с машины, которая связалась с вашей системой:

connection: first listen

Это возвращает соединение, которое было выполнено с портом прослушивания. Это порт, как и все остальные, и теперь его можно использовать для приема и отправки данных с помощью функций insert (вставка), copy (копирование), first (первый) и других последовательных функций:

insert connection "you are connected^/"

while [newline <> char: first connection] [
    print char
]

Когда связь будет завершена, соединение должно быть закрыто:

close connection

Теперь вы готовы к следующему подключению к порту прослушивания. Вы можете снова подождать (wait) и снова использовать first, чтобы установить соединение.

Когда вы закончите с обслуживанием, вы можете закрыть порт прослушивания с помощью:

close listen

14.3 Крошечный сервер

Вот полезный сервер REBOL, для которого требуется всего несколько строк кода. Этот сервер оценивает любой отправленный ему код REBOL. Строки REBOL читаются от клиента до тех пор, пока не возникнет ошибка. Каждая строка должна быть полным выражением REBOL. Они могут быть любой длины, но должны состоять из одной строки.

server-port: open/lines tcp://:4321

forever [
    connection-port: first server-port
    until [
        wait connection-port
        error? try [do first connection-port]
    ]
    close connection-port
]
close server-port

В случае ошибки соединение закрывается, и сервер ожидает следующего соединения.

Вот пример клиентского скрипта, который позволяет удаленно вводить командные строки REBOL:

server: open/lines tcp://localhost:4321
until [error? try [insert server ask "R> "]]
close server

Здесь запрос используется, чтобы определить, было ли соединение закрыто из-за ошибки.

14.4 Тестирование TCP-кода

Чтобы протестировать серверный код, подключитесь со своего собственного компьютера, вместо того, чтобы требовать и сервера, и клиента. Это можно сделать из двух отдельных процессов REBOL или даже из одного и того же процесса.

Чтобы подключиться к локальному компьютеру, вы можете использовать такую ​​строку, как:

port: open tcp://localhost:8001

Вот пример, в котором два порта подключаются друг к другу в линейном режиме. Это своего рода эхо- порт (echo), поскольку вы отправляете данные самому себе. Он обеспечивает хороший тест вашего кода и сети:

listen: open/lines tcp://:8001
remote: open/lines tcp://localhost:8001
local: first listen
insert local "How are you?"
print first remote  ; response
close local
close remote
close listen

15. UDP - протокол дейтаграмм пользователя (User Datagram Protocol)

Протокол дейтаграмм пользователя - это еще один протокол транспортного уровня, который обеспечивает связь между машинами без установления соединения. Он позволяет отправлять дейтаграммы, пакеты между машинами.

Работа UDP сильно отличается от TCP. UDP проще, но по сути ненадежен. Нет никакой гарантии, что пакет когда-либо достигнет места назначения. Кроме того, UDP не имеет управления потоком. Если вы отправляете сообщения слишком быстро, пакеты могут быть потеряны.

Как и TCP, функция wait (ожидание) может использоваться для ожидания прибытия следующего пакета, а функция copy используется для возврата данных. Если данных нет, копирование ждет, пока они не появятся. Обратите внимание, однако, что insert (вставка) никогда не ждет.

Вот пример простого скрипта UDP-сервера:

udp: open udp://:9999
wait udp
print copy udp
insert udp "response"
close udp

Сообщения, вставленные здесь сервером, отправляются клиенту, от которого сервер в последний раз получил сообщение. Это позволяет отправлять ответы на входящие сообщения. Однако, в отличие от TCP, у вас нет постоянного соединения между машинами. Каждая пакетная передача - это отдельный обмен.

Клиентский сценарий для связи с указанным выше сервером будет:

udp: open udp://localhost:9999
insert udp "Test"
wait udp
print copy udp
close udp

Вы должны знать, что максимальный размер пакета UDP зависит от операционной системы. 32 КБ и 64 КБ являются общими значениями. Чтобы отправлять большие объемы данных, вам необходимо буферизовать данные, разделив их на более мелкие части. Однако требуется тщательное программирование, чтобы гарантировать получение каждой части данных. Помните, что с UDP нет никаких гарантий.


Updated 20-Jul-2005 - Copyright REBOL Technologies - Formatted with MakeDoc2
REBOL.com Documents Manual Dictionary Library Feedback