OpenComputers/Internet API

Материал из Minecraft Wiki
Перейти к: навигация, поиск

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

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


Интерфейс[править | править вики-текст]

  • internet.request(url: string[, data: string or table]): function

Посылает 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 или другую функцию, которая работает с событиями, в процессе обработки строк результата. Это связано с тем, что каждая такая строка — это сигнал (таким образом программа избегает ошибок переполнения памяти при больших ответах).


  • internet.socket(address:string[, port:number]):table

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


  • internet.open(address:string[, port:number]):table

Открывает сокет по заданному адресу в виде буферизованного потока. Поток можно читать и писать в него методами 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


  • internet.isHttpEnabled():boolean

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


  • internet.isTcpEnabled():boolean

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


  • internet.request(url:string[, postData:string]):boolean

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


  • internet.connect(address:string[, port:number]):number

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


  • internet.read(handle:number, n:number):string

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


  • internet.write(handle:number, data:string): number

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


  • internet.close(handle:number)

Закрывает сокет с заданным заголовком (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