在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的
基础上很容易就能实现。
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 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", 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号。