0Pricing
Lua Academy · レッスン

luasocketによるノンブロッキングI/O

コルーチンスケジューラーと統合したノンブロッキングモードでluasocketを使用します。

「luasocketによるノンブロッキングI/O」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

luasocket とは

luasocket は、TCP/UDP ソケット、HTTP、FTP、SMTP クライアントを提供する Lua ライブラリです。デフォルトではブロッキング動作ですが、ノンブロッキングモードで非同期 I/O を利用できます。

luasocket のインストール

LuaRocks 経由でインストールします: luarocks install luasocket。スクリプト内で require します。

local socket = require("socket")
local tcp = socket.tcp()

TCP ソケットの作成

TCP クライアントソケットを作成し、サーバーに接続します。

local tcp = socket.tcp()
tcp:connect("example.com", 80)
tcp:send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
local response = tcp:receive("*a")
tcp:close()
print(response:sub(1, 200))

ノンブロッキングモード

tcp:settimeout(0) でソケットをノンブロッキングに設定します。データの準備ができていない場合、読み書きはタイムアウトエラーを返してすぐに戻ります。

tcp:settimeout(0)  -- non-blocking
local data, err = tcp:receive(1024)
if err == "timeout" then
  -- no data yet, try again later
elseif data then
  print("Got:", data)
end

コルーチンとの統合

ノンブロッキングソケットとコルーチンを組み合わせます。データの準備ができていないときは yield し、セレクタが準備完了を示したときにコルーチンを再開します。

local function readAsync(sock)
  while true do
    local data, err = sock:receive(1024)
    if data then return data end
    if err ~= "timeout" then error(err) end
    coroutine.yield()  -- let other tasks run
  end
end

socket.select

socket.select(readSet, writeSet, timeout) は I/O の準備ができたソケットの集合を返します。これは適切なイベントループの基盤となります。

local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
  local data = s:receive(1024)
  -- handle data
end

HTTP クライアント

luasocket には、簡単なリクエストに使用できる高レベルの HTTP モジュールが含まれています。

local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)

UDP ソケット

UDP はコネクションレスです。データグラムベースの通信には socket.udp() を使用します。

local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()

タイムアウト

:settimeout(seconds) でタイムアウトを設定します。タイムアウトを 0 にするとノンブロッキングになり、正の数値では部分的なブロッキングが許可され、nil では無期限にブロックします。

エラー処理のパターン

luasocket の関数は、失敗時に nil とエラー文字列を返します。必ず 2 番目の戻り値を確認します。

local ok, err = tcp:connect("host", 80)
if not ok then
  error("Connection failed: " .. tostring(err))
end

OpenResty という選択肢

LuaJIT で本番用のノンブロッキング I/O を実装する場合、OpenResty の cosockets のほうがはるかに高機能で高性能です。luasocket はスタンドアロンのスクリプトや簡単なツールに使用します。

ノンブロッキングに関する質問

tcp:settimeout(0) は何をしますか?

まとめ: ノンブロッキング I/O

ノンブロッキングソケットには settimeout(0) を使用し、I/O の多重化には socket.select を使用します。コルーチンと組み合わせ、タイムアウト時に yield し、データの準備ができたら再開します。高性能な非同期 I/O には、OpenResty または luv をお勧めします。

よくある質問

「luasocketによるノンブロッキングI/O」レッスンは無料ですか?

はい。「luasocketによるノンブロッキングI/O」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「luasocketによるノンブロッキングI/O」で何を学びますか?

コルーチンスケジューラーと統合したノンブロッキングモードでluasocketを使用します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「luasocketによるノンブロッキングI/O」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. シンプルなイベントループの構築
  2. コルーチンによるAsync/Await
  3. Promise風パターン
  4. luasocketによるノンブロッキングI/O
← Lua Academyに戻る