这一篇我们要把网络编程和数据库操作结合起来,实现一个简单的留言板功能。
1、功能需求
如下图
所示,客户端发送
“set XXX”
命令时,程序会把留 言“XXX”
存入数据库,发送
“get”
命令时,程序会把整个留言板返回给客户端。
2、代码实现
(1)在skynet/examples目录下新建一个main_message.lua文件,代码如下:
local skynet = require "skynet"
local socket = require "skynet.socket"
local mysql = require "skynet.db.mysql"
local db = nil
function connect(fd, addr)
--启用连接
print(fd.." connected addr:"..addr)
socket.start(fd)
--消息处理
while true do
local readdata = socket.read(fd)
--正常接收
if readdata ~= nil then
--返回留言板内容
if readdata == "get\r\n" then
local res = db:query("select * from message")
for i,v in pairs(res) do
socket.write (fd, v.id.." "..v.content.."\r\n")
end
--留言
else
local data = string.match(readdata, "set (.-)\r\n")
db:query("insert into message (content) values (\'"..data.."\')")
end
--断开连接
else
print(fd.." close ")
socket.close(fd)
end
end
end
skynet.start(function()
--网络监听
local listenfd = socket.listen("0.0.0.0", 6666)
socket.start(listenfd ,connect)
--连接数据库
db = mysql.connect({
host="127.0.0.1",
port=3306,
database="skynet",
user="root",
password="root",
max_packet_size = 1024 * 1024,
on_connect = nil
})
end)
-
新增变量 db 用于保存数据库对象;
-
服务启动后,开启网络监 听,并发起数据库连接;
-
如果客户端发送的数据是 “get\r\n” ,则查询数据库,然后将结果一条条地发回;
-
如果客户端发送的是 “set XXX” ,则用正则表达式将字符串XXX 提取出来(变量 data ), 然后插入数据库中。说明: “\r\n” 即换行符,在 telnet 中输入字符串,它会把换行符也发给服务端。
(2)在skynet/examples目录下新建一个config_message配置文件:
root = "./"
thread = 8
logger = nil
harbor = 0
start = "main_message" -- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap
luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua"
lualoader = "lualib/loader.lua"
snax = root.."examples/?.lua;"..root.."test/?.lua"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"
3、代码运行
打开终端输入指令:
- cd skynet
- ./skynet examples/config_message
如果运行报错,可能是监听端口被占用,可能是多次运行服务端所致,可以执行“ killall skynet ”命令关闭所有的Skynet 进程,然后在运行。如下图所示:
打开一个telnet客户端去连接主服务,然后输入get,显示结果如下图所示:
然后再输入set world,再输入get,显示结果如下图所示: