Skynet网络编程初体验

本篇使用skynet测试单机echo,在echo基础上改造为聊天室等功能

echo

首先开启一个服务,修改主服务为Pmain,引入skynet和skynet.socket两个模块,服务启动后(skynet.start),依次调用socket.listen和socket.start来监听9999端口

Pmain.lua

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

    
skynet.start(function()
    local listenfd = socket.listen("0.0.0.0", 9999)
    socket.start(listenfd ,connect)
end)


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)
            socket.write(fd, readdata)
        --断开连接
        else
            print(fd.." close ")
            socket.close(fd)
        end
    end
end

新客户端连接后调用connect方法,该方法先打印连接的地址,在while循环中用socket.read读取数据,收到数据则打印出来,且通过socket.write把数据原封不动返回给客户端,如果传入的readdata为nil则表示客户端关闭连接。

这里我们把该demo放入了更深的一层文件夹,在Econfig中需要修改部分

我这里放在了examples/echo/Pmain.lua

Econfig

--必须配置
thread = 8                          --启用多少个工作线程
cpath = "./cservice/?.so"           --用C编写的服务模块的位置
bootstrap = "snlua bootstrap"       --(固定)启动的第一个服务

--bootstrap配置项
start = "Pmain"                      --主服务入口
harbor = 0                          --(固定)不使用主从节点模式

--lua配置项(暂时固定)
lualoader = "./lualib/loader.lua"
luaservice = "./service/?.lua;".."./test/?.lua;".."./examples/echo/?.lua;".."./test/?/init.lua"
lua_path = "./lualib/?.lua;" .. "./lualib/?/init.lua"
lua_cpath = "./luaclib/?.so"

--后台模式(必要时开启)
--daemon = "./skynet.pid"
--logger = "./userlog"

注意start入口,还有luaservice中的第三个参数需要多加一层路径,最后我们启动主服务,且客户端用telnet模拟发包

运行

运行调试如图

GIF 2021-10-27 10-58-19

简易聊天室

主要需求就是1个客户端发送消息,经由服务端转发使得所有客户端都能收到消息,我们加工一下上面的Echo程序,首先定义clients表(用来存放所有的客户端标识),当客户端连接时,connect会调用clinets[fd]={}把新的fd保存在clients中,若断开连接则删除,转发过程则遍历clients表,逐个转发

Pmain.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", 9999)
    socket.start(listenfd ,connect)
end)

config文件则不需要变化,还是用刚才echo的

运行

到这里就简单实现聊天室了

GIF 2021-10-27 11-06-46

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上上签i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值