官术网_书友最值得收藏!

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引擎搭建它。

主站蜘蛛池模板: 黄骅市| 陆河县| 青岛市| 西充县| 广汉市| 开远市| 集贤县| 中江县| 江安县| 浪卡子县| 开鲁县| 革吉县| 成武县| 镇远县| 汉川市| 广昌县| 临漳县| 巴林左旗| 江西省| 积石山| 边坝县| 河曲县| 海口市| 监利县| 遂平县| 临泉县| 交口县| 北宁市| 夹江县| 乡宁县| 泸溪县| 沙雅县| 荣成市| 华池县| 松溪县| 恩施市| 左贡县| 山丹县| 习水县| 盐源县| 古蔺县|