上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)
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) --断开连接 else print(fd.." close ") socket.close(fd) end end end
本节程序很简单,下面留一个作业给读者。还记得1.4.3节的“搭个简单的分布式服务端”吗?现在你已完全掌握用Skynet实现此功能的全部知识,结合ping程序,尝试用Skynet引擎搭建它。