【从零开始学Skynet】基础篇(五):简易聊天室

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

1、功能需求

 客户端发送一条消息,经由服务端转发,所有在线客户端都能收到,如下图所示:
【从零开始学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 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)
  1. 首先定义一个表 clients ,用于存放客户端连接,它将以连接标识fd 为索引来保存连接信息;
  2. 客户端建立连接时connect被调用,它会通过“clients[fd]={}” 把新的 fd 存放到 clients 表中;
  3. 若在此过程中接收到数据,则遍历 clients 表,逐个转发;
  4. 断开连接时,通过 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、运行代码

  1. 首先在终端输入指令(这里不再重复,上一篇文章有),启动主服务;
  2. 然后开启两个telnet客户端对主服务进行连接;
  3. 连接成功之后,客户端1号发送“hello”的消息给主服务;
  4. 主服务收到消息之后,再转发给客户端1号客户端2号

【从零开始学Skynet】基础篇(五):简易聊天室_第2张图片

你可能感兴趣的:(从零开始学Skynet,lua,Skynet,服务器开发)