พื้นฐาน TCP
เชื่อมต่อและส่งข้อมูล
พื้นฐาน TCP เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
LuaSocket คืออะไร
LuaSocket คือไลบรารีเครือข่ายโดยพฤตินัยสำหรับ Lua โดยมีซ็อกเก็ต TCP และ UDP ระดับพื้นฐาน รวมถึงตัวช่วยระดับสูงสำหรับ HTTP, SMTP และ FTP
ไลบรารีนี้เป็นโมดูล C ภายนอก จึงไม่ได้เป็นส่วนหนึ่งของ Lua มาตรฐาน คุณติดตั้งได้ผ่าน LuaRocks และโหลดด้วย require
โค้ดตัวอย่างในบทเรียนนี้ไม่สามารถทำงานบนสนามทดลองทั่วไปได้ เพราะต้องเชื่อมต่อเครือข่าย
local socket = require("socket")
print(socket._VERSION)การสร้างซ็อกเก็ต TCP
ออบเจ็กต์หลักคือซ็อกเก็ตหลัก TCP ซึ่งสร้างด้วย socket.tcp() ซ็อกเก็ตหลักใหม่ยังไม่ได้เชื่อมต่อและยังไม่ได้ผูกกับที่อยู่ใด
จากซ็อกเก็ตหลัก คุณสามารถใช้ connect เพื่อเปลี่ยนให้เป็นออบเจ็กต์ไคลเอนต์ หรือใช้ bind+listen เพื่อเปลี่ยนให้เป็นออบเจ็กต์เซิร์ฟเวอร์
การเรียกใช้ส่วนใหญ่จะคืนค่าหรือคืนค่า nil พร้อมสตริงข้อผิดพลาด ดังนั้นให้รับค่าทั้งสองไว้เสมอ
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endตระกูลที่อยู่
TCP ทำงานผ่าน IPv4 หรือ IPv6 socket.tcp() จะเลือกตระกูลเมื่อจำเป็น ส่วน socket.tcp4() และ socket.tcp6() จะบังคับใช้ตระกูลใดตระกูลหนึ่ง
ใช้ socket.dns.toip(host) เพื่อแปลงชื่อโฮสต์เป็นที่อยู่ตัวเลขก่อนเชื่อมต่อ หากต้องการควบคุมอย่างชัดเจน
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)การเชื่อมต่อกับโฮสต์
conn:connect(host, port) ดำเนินการจับมือสามทางของ TCP เมื่อสำเร็จจะคืนค่า 1 แต่เมื่อไม่สำเร็จจะคืนค่า nil และข้อความข้อผิดพลาด เช่น "connection refused" หรือ "timeout"
ฟังก์ชันอำนวยความสะดวก socket.connect(host, port) จะสร้างซ็อกเก็ตและเชื่อมต่อให้เสร็จในการเรียกครั้งเดียว
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endการส่งข้อมูล
conn:send(data) ใช้เขียนไบต์ลงในซ็อกเก็ต โดยคืนค่าดัชนีของไบต์สุดท้ายที่ส่ง สำหรับซ็อกเก็ตแบบบล็อก ค่านี้มักเป็นความยาวทั้งหมดของ data
TCP เป็นกระแสไบต์ ไม่ใช่โพรโทคอลข้อความ ดังนั้นการเรียก send ครั้งเดียวอาจถูกแบ่งหรือรวมเข้ากับข้อมูลอื่นระหว่างส่งผ่านเครือข่าย คุณต้องกำหนดกรอบข้อความของตนเอง
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)การรับข้อมูล
conn:receive(pattern) อ่านข้อมูลจากกระแสข้อมูล รูปแบบเริ่มต้น "*l" จะอ่านหนึ่งบรรทัดโดยไม่รวมอักขระขึ้นบรรทัดใหม่ ส่วน "*a" จะอ่านจนกว่าการเชื่อมต่อจะปิด
คุณยังสามารถส่งตัวเลขเพื่ออ่านไบต์ให้ครบตามจำนวนนั้นได้ เมื่อเกิดข้อผิดพลาด จะคืนค่า nil สตริงข้อผิดพลาด และข้อมูลบางส่วนที่รับมาได้
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")การปิดการเชื่อมต่อ
เรียกใช้ conn:close() เสมอเมื่อทำงานเสร็จ เพื่อปล่อยตัวระบุไฟล์และส่ง FIN ของ TCP
คุณสามารถปิดการสื่อสารเพียงครึ่งหนึ่งด้วย conn:shutdown("send") เพื่อส่งสัญญาณว่าสิ้นสุดกระแสข้อมูลแล้ว ขณะยังอ่านการตอบกลับจากอีกฝั่งได้ วิธีนี้เหมาะสำหรับโพรโทคอลคำขอ/การตอบกลับที่ใช้ "*a"
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()ความสำคัญของระยะหมดเวลา
โดยค่าเริ่มต้น ซ็อกเก็ตจะบล็อกตลอดไป conn:settimeout(seconds) ใช้จำกัดระยะเวลาที่การเรียกใช้จะรอ ค่า 0 จะทำให้ซ็อกเก็ตทำงานแบบไม่บล็อก
เมื่อหมดเวลา การเรียกใช้จะคืนค่า nil และสตริง "timeout" ในระบบที่ใช้งานจริง ควรกำหนดระยะหมดเวลาเสมอเพื่อป้องกันการเชื่อมต่อค้าง
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP เทียบกับ UDP
TCP ทำงานโดยยึดการเชื่อมต่อ มีลำดับ และมีความน่าเชื่อถือ กล่าวคือไบต์จะมาถึงเพียงครั้งเดียวและเรียงตามลำดับ โดยต้องแลกกับการจับมือเชื่อมต่อและการส่งซ้ำ
UDP (socket.udp()) ไม่ต้องสร้างการเชื่อมต่อและไม่มีความน่าเชื่อถือ แต่มีน้ำหนักเบา จึงเหมาะกับข้อมูลวัดระยะไกลหรือเกม หลักสูตรนี้เน้น TCP เพราะเป็นพื้นฐานของ HTTP
การส่งข้อมูลบางส่วนและลูป
สำหรับซ็อกเก็ตแบบไม่บล็อก send อาจส่งข้อมูลจากบัฟเฟอร์ของคุณได้เพียงบางส่วน โดยจะส่งคืน nil, "timeout" และดัชนีของไบต์สุดท้ายที่เขียนได้ถึงตอนนั้น
ตัวส่งที่ทำงานได้อย่างทนทานจะวนลูป โดยส่งต่อจากไบต์ถัดจากไบต์สุดท้ายที่ส่งไปแล้ว จนกว่าบัฟเฟอร์ทั้งหมดจะถูกส่งออกไป
local i = 1
while i <= #data do
local sent, err, last = conn:send(data, i)
i = (sent or last) + 1
if err and err ~= "timeout" then break end
endการตรวจสอบการเชื่อมต่อ
conn:getpeername() ส่งคืน IP ระยะไกลและพอร์ต ขณะที่ conn:getsockname() ส่งคืนปลายทางภายในเครื่อง ข้อมูลเหล่านี้ช่วยในการบันทึกการทำงานและการแก้จุดบกพร่อง
conn:setoption("keepalive", true) และ conn:setoption("tcp-nodelay", true) ใช้ปรับพฤติกรรมของซ็อกเก็ตพื้นฐาน
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับความหมายของการรับข้อมูลของ TCP
สรุปทบทวน
คุณได้ทำความรู้จักกับออบเจ็กต์หลักของ TCP ใน LuaSocket เรียนรู้การสร้าง การ connect การส่ง การรับ และการปิดซ็อกเก็ต รวมทั้งเห็นว่าเวลาหมดและการปิดการเชื่อมต่อเพียงด้านเดียวส่งผลต่อพฤติกรรมอย่างไร
โปรดจำไว้ว่า TCP เป็นสตรีมไบต์ การเรียกแต่ละครั้งอาจส่งคืน nil, err และซ็อกเก็ตสำหรับใช้งานจริงต้องตั้งเวลาหมดเสมอ ขั้นถัดไปคุณจะนำชิ้นส่วนเหล่านี้มาประกอบเป็นลูกข่ายที่ใช้งานได้
คำถามที่พบบ่อย
บทเรียน “พื้นฐาน TCP” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐาน TCP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน TCP”
เชื่อมต่อและส่งข้อมูล คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐาน TCP” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน TCP
- สร้างไคลเอนต์
- สร้างเซิร์ฟเวอร์
- คำขอ HTTP