Lua 常用库系列:第四篇【网络库】 网络编程在现代应用开发中占据着重要地位,Lua 也提供了强大的网络库,帮助开发者轻松实现网络通信功能。本文将详细介绍 Lua 的网络库及其常用函数和使用方法。 网络库概述Lua 的网络库主要由 socket 库提供,socket 库支持 TCP、UDP 等常见网络协议,并提供了一系列方便的函数用于网络编程。我们将分别介绍 TCP 和 UDP 通信的实现方法。 一、TCP 通信TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,广泛应用于各种网络应用。以下是 Lua 中使用 socket 库实现 TCP 通信的示例: 1. TCP 服务器 local socket = require("socket")
-- 创建 TCP 服务器
local server = socket.tcp()
server:bind("127.0.0.1", 8080)
server:listen(5)
print("TCP 服务器启动,监听端口 8080...")
while true do
local client = server:accept()
local request = client:receive()
print("收到请求: " .. request)
local response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, Lua TCP Server!"
client:send(response)
client:close()
end2. TCP 客户端 local socket = require("socket")
-- 创建 TCP 客户端
local client = socket.tcp()
client:connect("127.0.0.1", 8080)
local request = "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n"
client:send(request)
local response = client:receive("*a")
print("收到响应: " .. response)
client:close()二、UDP 通信UDP(User Datagram Protocol)是一种无连接的、快速的传输协议,适用于需要快速传输和低延迟的应用。以下是 Lua 中使用 socket 库实现 UDP 通信的示例: 1. UDP 服务器 local socket = require("socket")
-- 创建 UDP 服务器
local server = socket.udp()
server:setsockname("127.0.0.1", 8080)
print("UDP 服务器启动,监听端口 8080...")
while true do
local data, ip, port = server:receivefrom()
print("收到来自 " .. ip .. ":" .. port .. " 的数据: " .. data)
local response = "Hello, Lua UDP Server!"
server:sendto(response, ip, port)
end2. UDP 客户端 local socket = require("socket")
-- 创建 UDP 客户端
local client = socket.udp()
client:setpeername("127.0.0.1", 8080)
local message = "Hello, UDP Server!"
client:send(message)
local response = client:receive()
print("收到响应: " .. response)三、实用小工具在网络编程中,一些实用的小工具函数可以提高开发效率。以下是两个常用的小工具函数示例: local socket = require("socket")
function isPortInUse(host, port)
local test = socket.tcp()
test:settimeout(1)
local result = test:connect(host, port)
test:close()
return result ~= nil
end
print(isPortInUse("127.0.0.1", 8080)) -- 输出: true 或 falselocal socket = require("socket")
function getLocalIPAddress()
local s = socket.udp()
s:setpeername("8.8.8.8", 80)
local ip = s:getsockname()
s:close()
return ip
end
print("本地 IP 地址: " .. getLocalIPAddress())四、综合示例通过组合使用 socket 库,可以实现一个简单的聊天室应用。以下是聊天室服务器和客户端的示例: 聊天室服务器: local socket = require("socket")
local server = socket.tcp()
server:bind("127.0.0.1", 8080)
server:listen(5)
local clients = {}
print("聊天室服务器启动,监听端口 8080...")
while true do
local client = server:accept()
table.insert(clients, client)
local ip, port = client:getpeername()
print("新客户端连接: " .. ip .. ":" .. port)
local co = coroutine.create(function()
while true do
local message, err = client:receive()
if not message then
print("客户端断开连接: " .. ip .. ":" .. port)
break
end
print("收到消息: " .. message)
for _, c in ipairs(clients) do
if c ~= client then
c:send(message .. "\n")
end
end
end
end)
coroutine.resume(co)
end聊天室客户端: local socket = require("socket")
local client = socket.tcp()
client:connect("127.0.0.1", 8080)
local function sendMessages()
while true do
local message = io.read()
client:send(message .. "\n")
end
end
local function receiveMessages()
while true do
local message, err = client:receive()
if message then
print("收到消息: " .. message)
end
end
end
local coSend = coroutine.create(sendMessages)
local coReceive = coroutine.create(receiveMessages)
coroutine.resume(coSend)
coroutine.resume(coReceive)总结本文介绍了 Lua 网络库中的 TCP 和 UDP 通信的常用函数及其使用方法。这些函数提供了强大的网络编程能力,帮助开发者高效地实现各种网络通信任务。 |