本篇使用skynet测试单机echo,在echo基础上改造为聊天室等功能
echo
首先开启一个服务,修改主服务为Pmain,引入skynet和skynet.socket两个模块,服务启动后(skynet.start),依次调用socket.listen和socket.start来监听9999端口
Pmain.lua
local skynet = require "skynet"
local socket = require "skynet.socket"
skynet.start(function()
local listenfd = socket.listen("0.0.0.0", 9999)
socket.start(listenfd ,connect)
end)
function connect(fd, addr)
--启用连接
print(fd.." connected addr:"..addr)
socket.start(fd)
--消息处理
while true do
local readdata = socket.read(fd)
--正常接收
if readdata ~= nil then
print(fd.." recv "..readdata)
socket.write(fd, readdata)
--断开连接
else
print(fd.." close ")
socket.close(fd)
end
end
end
新客户端连接后调用connect方法,该方法先打印连接的地址,在while循环中用socket.read读取数据,收到数据则打印出来,且通过socket.write把数据原封不动返回给客户端,如果传入的readdata为nil则表示客户端关闭连接。
这里我们把该demo放入了更深的一层文件夹,在Econfig中需要修改部分
我这里放在了examples/echo/Pmain.lua
Econfig
--必须配置
thread = 8 --启用多少个工作线程
cpath = "./cservice/?.so" --用C编写的服务模块的位置
bootstrap = "snlua bootstrap" --(固定)启动的第一个服务
--bootstrap配置项
start = "Pmain" --主服务入口
harbor = 0 --(固定)不使用主从节点模式
--lua配置项(暂时固定)
lualoader = "./lualib/loader.lua"
luaservice = "./service/?.lua;".."./test/?.lua;".."./examples/echo/?.lua;".."./test/?/init.lua"
lua_path = "./lualib/?.lua;" .. "./lualib/?/init.lua"
lua_cpath = "./luaclib/?.so"
--后台模式(必要时开启)
--daemon = "./skynet.pid"
--logger = "./userlog"
注意start入口,还有luaservice中的第三个参数需要多加一层路径,最后我们启动主服务,且客户端用telnet模拟发包
运行
运行调试如图
简易聊天室
主要需求就是1个客户端发送消息,经由服务端转发使得所有客户端都能收到消息,我们加工一下上面的Echo程序,首先定义clients表(用来存放所有的客户端标识),当客户端连接时,connect会调用clinets[fd]={}把新的fd保存在clients中,若断开连接则删除,转发过程则遍历clients表,逐个转发
Pmain.lua
local skynet = require "skynet"
local socket = require "skynet.socket"
local clients = {}
function connect(fd, addr)
--启用连接
print(fd.." connected addr:"..addr)
socket.start(fd)
clients[fd] = {}
--消息处理
while true do
local readdata = socket.read(fd)
--正常接收
if readdata ~= nil then
print(fd.." recv "..readdata)
for i, _ in pairs(clients) do --广播
socket.write(i, readdata)
end
--断开连接
else
print(fd.." close ")
socket.close(fd)
clients[fd] = nil
end
end
end
skynet.start(function()
local listenfd = socket.listen("0.0.0.0", 9999)
socket.start(listenfd ,connect)
end)
config文件则不需要变化,还是用刚才echo的
运行
到这里就简单实现聊天室了