Skynet 通过组播(Multicast)实现一个简单的世界频道

Stella981
• 阅读 662

什么是世界频道?

    "世界频道" 这个概念就是在一个游戏内经常见到。简单来说,世界频道就是在游戏内的一个大区中所有玩家可以接收、发布的消息的一个玩家间的统称。

    玩家在游戏中进行体验的同时,通常需要发布一些特殊的消息,包含:"买卖装备、组队等";通常游戏中的各种频道的实现都依赖于消息队列的广播方式。

Skynet的组播解决了什么问题?

    Skynet将消息通过指针进行传递到不同的服务之间,实现的简单的消息队列。当组播的消息较大时,可以节省内部网络的带宽。

下面直接上代码:

#Main:

local skynet = require "skynet"
local socket = require "socket"


skynet.start(function()
    local id = socket.listen("192.168.2.5",80)
    socket.start(id,function(fd,ipaddr)
        local network = skynet.newservice "network"
        skynet.send(network,"lua","Connection",fd,ipaddr)
        socket.abandon(fd)
    end)
    

end)

#network

local skynet = require "skynet"
local msg = require "multicast"
local socket = require "socket"


skynet.init(function()

    -- 注册世界聊天频道
    world_channel = skynet.uniqueservice "world_chat"
    msg_fd = msg.new {
        channel = skynet.call(world_channel,"lua","getMsgId"),
        dispatch = get_subscribeMsg,
    }

end)


local CMD = { }



function CMD.Connection(fd,ipaddr)
    CMD.fd,CMD.ipaddr = fd,ipaddr
    --print "订阅消息"
    msg_fd:subscribe()
    socket.start(fd)
    socket.write(fd,"welcome!\n\r>>")
    while fd do


        local buf = socket.readline(fd)

        if buf then

            msg_fd:publish(buf)
        else
            skynet.error("Client Closed this Connection...")

            break
        end

    end
    socket.close(fd)
    msg_fd:unsubscribe()
    skynet.exit()
end


function get_subscribeMsg(channel,session,msg)
    socket.write(CMD.fd,msg)
    socket.write(CMD.fd,"\r\n>>")
end


skynet.start(function()
    skynet.dispatch("lua",function(_,_,cmd,...)
        local f = assert(CMD[cmd],"找不到指定的处理函数...")
        if f then 
            f(...)
        end
    end)
end)

#world_chat

local skynet = require "skynet"
local msg = require "multicast"

local CMD = { }


skynet.init(function()
    print "初始化世界频道...."
    world_channel = msg.new()
end)


function CMD.getMsgId()
    skynet.ret(skynet.pack(world_channel.channel))    
end


skynet.start(function()
    skynet.dispatch("lua",function(_,_,cmd,...)
        local f = assert(CMD[cmd],"找不到指定的处理函数...")
        if f then 
            f(...)
        end
    end)
end)

    上述代码通过Skynet 的multicast实现了简单的世界聊天,在退出后关闭订阅。

    而上述代码也存在两个问题。至于是什么问题?这个就留给大家自己思考了。:)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Redis 发布订阅
Redis发布订阅Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。下图展示了频道channel1,以及订阅这个频道的三个客户端——client2、client5和client1之间的关系:!(
Stella981 Stella981
2年前
Redis发布订阅
简介发布者和订阅者都是Redis客户端。发布者可以发消息到任意多个频道上,订阅者可以订阅任意多个频道。订阅命令subscribe channel\channel...\:返回的数字1,2表示订阅的第n个频道,频道返回的消息类型是message127.0.0.1:6379subscribeeduca
Wesley13 Wesley13
2年前
Java语言的Hook实现
<divid"blog\_content"class"blog\_content"<p引言:最近在玩完美时空的诛仙Online(不知道这里有没人有共同爱好的),这个游戏每晚七点会出现一个任务“新科试炼”。这个任务简单地说就是做选择题,范围小到柴米油盐,大到世界大千,所以多玩的YY上出现一个频道叫“诛仙答题频道”,这个频道会即时为玩家提供正确答案
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
流浪剑客 流浪剑客
6个月前
Mac海洋冒险游戏:潜水员戴夫Dave The Diver中文版
是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩家将解锁新的关卡和故事情
流浪剑客 流浪剑客
5个月前
海洋冒险游戏:潜水员戴夫Dave The Diver中文激活版
是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩家将解锁新的关卡和故事情
铁扇公主 铁扇公主
5个月前
海洋冒险游戏:潜水员戴夫Dave The Diver中文安装包最新
DaveTheDiver是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩
绣鸾 绣鸾
5个月前
潜水员戴夫Dave The Diver for mac(海洋冒险游戏)
是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩家将解锁新的关卡和故事情