百万在线:大型游戏服务端开发
上QQ阅读APP看书,第一时间看更新

2.5 做聊天室,学习多人交互

在游戏中各玩家可以交互,这在2.4节的基础上很容易实现。

2.5.1 功能需求

图2-17所示为客户端发送一条消息,经由服务端转发,所有在线客户端都能收到。

图2-17 聊天室示意图

2.5.2 代码实现

修改2.4节的Echo程序来实现交互功能(如代码2-7所示),其中加底纹的语句值得特别注意,此程序的结构和1.2.4节的示例很相似。

首先定义名为clients的表,用于存放客户端连接,它将以连接标识fd为索引来保存连接信息。当客户端建立连接时,connect被调用,它会通过“clients[fd]={}”把新的fd存放到clients表中。本例较简单,将以空表{}代表客户端的信息。断开连接时,通过clients[fd]=nil删除客户端信息。若在此过程中接收到数据,则遍历clients表,逐个转发。

代码2-7 examples/Pmain.lua中的部分内容

(资源:Chapter2/4_chat.lua)


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

本节程序很简单,下面留一个作业给读者。还记得1.4.3节的“搭个简单的分布式服务端”吗?现在你已完全掌握用Skynet实现此功能的全部知识,结合ping程序,尝试用Skynet引擎搭建它。