Этот интерфейс реализует функциональность интернет плат.
Для передачи информации между компьютерами внутри игры смотрите: Сетевая плата, Беспроводная сетевая плата.
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