OpenComputers/Internet API

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

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



## Интерфейс

`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