I/O แบบไม่บล็อกด้วย luasocket
ใช้ luasocket ในโหมดไม่บล็อก โดยทำงานร่วมกับตัวจัดตารางโคโรทีน
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
endsocket.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างลูปเหตุการณ์อย่างง่าย
- Async/Await ด้วยโคโรทีน
- รูปแบบคล้าย Promise
- I/O แบบไม่บล็อกด้วย luasocket