Lua Academy · บทเรียน

I/O แบบไม่บล็อกด้วย luasocket

ใช้ luasocket ในโหมดไม่บล็อก โดยทำงานร่วมกับตัวจัดตารางโคโรทีน

บทเรียน 4 จาก 413 ขั้นตอน

I/O แบบไม่บล็อกด้วย luasocket เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

luasocket คืออะไร

luasocket เป็นไลบรารี Lua ที่มีซ็อกเก็ต TCP/UDP รวมถึงไคลเอ็นต์ HTTP, FTP และ SMTP โดยค่าเริ่มต้นจะทำงานแบบบล็อก โหมดไม่บล็อกช่วยให้ใช้อินพุต/เอาต์พุตแบบอะซิงก์ได้

การติดตั้ง luasocket

ติดตั้งผ่าน LuaRocks: luarocks install luasocket แล้วนำเข้าในสคริปต์

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 เมื่อข้อมูลยังไม่พร้อม แล้ว resume โครูทีนเมื่อเครื่องมือเลือกแจ้งว่าพร้อมทำงาน

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) คืนค่าชุดซ็อกเก็ตที่พร้อมสำหรับอินพุต/เอาต์พุต ซึ่งเป็นพื้นฐานของวนรอบเหตุการณ์ที่เหมาะสม

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 พร้อมข้อความข้อผิดพลาดเมื่อล้มเหลว โปรดตรวจสอบค่าที่คืนกลับลำดับที่สองเสมอ

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

ทางเลือก OpenResty

สำหรับอินพุต/เอาต์พุตแบบไม่บล็อกใน LuaJIT ซ็อกเก็ตแบบประสานงานของ OpenResty มีความสามารถและประสิทธิภาพสูงกว่ามาก ควรใช้ luasocket กับสคริปต์แบบทำงานเดี่ยวและเครื่องมืออย่างง่าย

คำถามเรื่องโหมดไม่บล็อก

tcp:settimeout(0) ทำอะไร

ทบทวน: อินพุต/เอาต์พุตแบบไม่บล็อก

ใช้ settimeout(0) กับซ็อกเก็ตแบบไม่บล็อก และใช้ socket.select เพื่อมัลติเพล็กซ์อินพุต/เอาต์พุต ผสานเข้ากับโครูทีนโดยใช้ yield เมื่อหมดเวลา และ resume เมื่อข้อมูลพร้อมใช้งาน สำหรับอินพุต/เอาต์พุตแบบอะซิงก์ที่มีประสิทธิภาพสูง ควรเลือกใช้ OpenResty หรือ luv

เริ่มต้นได้ฟรี

เรียนรู้ Lua ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
40
บทเรียน
159

คำถามที่พบบ่อย

บทเรียน “I/O แบบไม่บล็อกด้วย luasocket” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “I/O แบบไม่บล็อกด้วย luasocket” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “I/O แบบไม่บล็อกด้วย luasocket”

ใช้ luasocket ในโหมดไม่บล็อก โดยทำงานร่วมกับตัวจัดตารางโคโรทีน คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “I/O แบบไม่บล็อกด้วย luasocket” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างลูปเหตุการณ์อย่างง่าย
  2. Async/Await ด้วยโคโรทีน
  3. รูปแบบคล้าย Promise
  4. I/O แบบไม่บล็อกด้วย luasocket
← กลับไปที่ Lua Academy