【从零开始学Skynet】基础篇(五):简易聊天室
在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。
1、功能需求

2、代码实现
在skynet/examples目录下创建main_chat.lua文件,然后把main_echo.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 dolocal readdata=socket.read(fd)--正常接收if readdata~=nil thenprint(fd.." recv "..readdata)for i, _ in pairs(clients) do --广播socket.write(i, readdata)end--断开连接elseprint(fd.." close ")socket.close(fd)clients[fd]=nilendend
endskynet.start(function()local listenfd = socket.listen("0.0.0.0", 8888)socket.start(listenfd ,connect)
end)
-
首先定义一个表clients,用于存放客户端连接,它将以连接标识fd为索引来保存连接信息;
-
客户端建立连接时connect被调用,它会通过“clients[fd]={}”把新的fd存放到clients表中;
-
若在此过程中接收到数据,则遍历clients表,逐个转发;
-
断开连接时,通过clients[fd]=nil删除客户端信息。
3、配置文件
在skynet/examples目录下创建config_chat文件,配置参数如下所示:
include "config.path"thread = 8
logger = nil
logpath = "."
harbor = 0
start = "main_chat" -- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"
4、运行代码
- 首先在终端输入指令(这里不再重复,上一篇文章有),启动主服务;
- 然后开启两个telnet客户端对主服务进行连接;
- 连接成功之后,客户端1号发送“hello”的消息给主服务;
- 主服务收到消息之后,再转发给客户端1号和客户端2号。