> 文章列表 > 【从零开始学Skynet】基础篇(八):简易留言板

【从零开始学Skynet】基础篇(八):简易留言板

【从零开始学Skynet】基础篇(八):简易留言板

        这一篇我们要把网络编程和数据库操作结合起来,实现一个简单的留言板功能。

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 = nilfunction connect(fd, addr)--启用连接print(fd.." connected addr:"..addr)socket.start(fd)--消息处理while true dolocal readdata = socket.read(fd)--正常接收if readdata ~= nil then--返回留言板内容if readdata == "get\\r\\n" thenlocal res = db:query("select * from message")for i,v in pairs(res) dosocket.write (fd, v.id.." "..v.content.."\\r\\n")end--留言elselocal data = string.match(readdata, "set (.-)\\r\\n")db:query("insert into message (content) values (\\'"..data.."\\')")end--断开连接elseprint(fd.." close ")socket.close(fd)endend
endskynet.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,显示结果如下图所示: