OpenComputers/Internet API

Этот интерфейс реализует функциональность интернет плат.

Для передачи информации между компьютерами внутри игры смотрите: Сетевая плата, Беспроводная сетевая плата.


Интерфейс

Посылает HTTP-запрос по заданному URL, с заданными POST данными. Если данные не определены, будет произведен GET запрос. Данные POST могут быть в одном из двух форматов: если это строка, она будет передана "как есть". Если это таблица — она будет конвертирована в строку, предполагая, что каждый ключ — название переменной POST, а значение ключа — её значение. К примеру:

internet.request(url, {some = "variable", another = 1})

Будет послана строка some=variable&another=1


Возвращаемое значение — итератор чанков (фрагментов) результата. Пример использования:

for chunk in internet.request(...) do stuff() end

Важно: не вызывайте os.sleep, event.pull или другую функцию, которая работает с событиями, в процессе обработки строк результата. Это связано с тем, что каждая такая строка — это сигнал (таким образом программа избегает ошибок переполнения памяти при больших ответах).


Открывает TCP сокет, используя метод интернет-компонента (см. далее) connect и создавая таблицу с теми же методами, что и при открытии файла через filesystem.open: read, write и close (а также seek, который будет всегда выдавать ошибку). Рекомендуется использовать вместо нее internet.open, которая создает буферизованную обертку (аналогично io.open при работе с файлами).


Открывает сокет по заданному адресу в виде буферизованного потока. Поток можно читать и писать в него методами s:read и s:write. В общем случае это происходит так же как при работе с файлами через io.open. Во многих случаях также удобно установить таймаут на чтение буфера функцией s:setTimeout(seconds) чтобы избежать блокирования на неопределенное время. Пример использования:

local internet = require("internet") local handle = internet.open("example.com", 1337) local data = handle:read(10) handle:write("1234") handle:close()


Интернет компонент

Набор функций более низкого уровня (например, проверка доступности запросов HTTP и TCP функциональность)

Примечание: Для того, чтобы воспользоваться низкоуровневыми функциями, обращайтесь к интернет-плате как к компоненту. Например:

local com = require('component') local internet = com.internet


Проверяет, доступны ли запросы HTTP на сервере (настройка конфигурации).


Проверяет, доступны ли TCP сокеты на сервере (настройка конфигурации).


Запускает HTTP запрос по заданному URL с заданными POST данными (если есть). Ответ обрабатывается как http_response сигнал. Возможно использование вместо нее "обертки" с итератором internet.request.


Открывает новое TCP соединение. Возвращает его заголовок (handle), который используется для взаимодействия с открытым сокетом при помощи других функций. Может вызвать ошибку, если TCP сокеты не разрешены, существует слишком много открытых соединений, либо произошла другая ошибка ввода/вывода (I/O error). Удобнее использовать буферизованную функцию internet.open.


Читает данные из потока. Возвращает массив прочитанных байтов. Использует заголовок (handle), полученный при соединении (internet.connect).


Пишет данные в поток. Возвращает число записанных байт. Использует заголовок (handle), полученный при соединении (internet.connect).


Закрывает сокет с заданным заголовком (handle). Использует заголовок (handle), полученный при соединении (internet.connect).


Пример

Этот пример — базовый IRC бот, который возвращает обратно все, что вы ему скажете. Написан с использованием сокетов и Internet API.

--this is just a basic split function we'll use to split the messages function split(data, pat) local ret = {} for i in string.gmatch(data,pat) do table.insert(ret,i) end return ret end --config local nickname = "myircbot" local channel = "#mybotchannel" local net = require("internet") local con = net.open("irc.esper.net",6667) --define server / port here, this will connect to the server if(con) then local line,png,linesplt,msgfrom = "" while(true) do line = con:read() --read a line from the socket print(line) linesplt = split(line,"[^:]+") if #linesplt >= 2 and string.find(linesplt[2], "No Ident response") ~= nil then print("JOIN") con:write("USER " .. nickname .. " 0 * :" .. nickname .. "\r\n") --con:write(msg) is used to send messages, con:read() will read a line con:write("NICK " .. nickname .. "\r\n") --for IRC, remember to append the \r\n on the end of all messages con:write("JOIN :" .. channel .. "\r\n") elseif linesplt[1] == "PING" or linesplt[1] == "PING " then print("PING") png = split(line,"[^:]+") con:write("PONG :"..png[#png].."\r\n") --respond to pings so we don't get disconnected elseif string.find(linesplt[1], "PRIVMSG #") ~= nil then msgfrom = split(linesplt[1],"[^ ]+") msgfrom = msgfrom[3] con:write("PRIVMSG "..msgfrom.." :"..linesplt[2].."\r\n") end end else print("Connection failed.") end


Более продвинутый пример — IRC клиент, который доступен в последней сборке OpenComputers: irc.lua

В данной статье используются материалы из статьи «OpenComputers/Internet API» с вики-сайта Minecraft Wiki, расположенного на Фэндоме, и они распространяются согласно лицензии Creative Commons Attribution-Share Alike. Авторы статьи.